我想应用一个函数,该函数依赖于数据框中多对 2 列中的 2 列数据。例如,使用 tidyverse 我的 df 看起来像:
test_df <- tibble(w = c("yes", "no"), x = c(1, 2), y = c("no", "yes"), z = c(4, 5))
我想应用以下功能:
function(a, b) = ifelse(a == "yes", b * 5, b)
但我想将其应用于 w,x 和 y,z 列。
我尝试过:
test_df %>% mutate_at(.vars = vars(c(w, y), c(x, z)), function(a,b) ifelse(a == "yes", b * 5, b))
但是出现“b”未定义的错误。我希望不要为此使用循环,因为我的数据集非常大,并且我有很多列对要迭代。
我也尝试过pivot_longer,但是我的df中还有很多其他列,所以pivot_longer很快就会变得混乱。
如有任何帮助,我们将不胜感激!
此方法依赖于文本和数字列的匹配对,仅此而已。
library(tidyverse)
char_col <- select(test_df, where(is.character)) %>% colnames
num_col <- select(test_df, where(is.numeric)) %>% colnames
bind_cols(
select(test_df, all_of(char_col)) %>%
pivot_longer(everything()),
select(test_df, all_of(num_col)) %>%
pivot_longer(everything(), names_to = "name2", values_to = "value2")
) %>%
mutate(value3 = value2 * if_else(value == "yes", 5, 1))
结果:
# A tibble: 4 × 5
name value name2 value2 value3
<chr> <chr> <chr> <dbl> <dbl>
1 w yes x 1 5
2 y no z 4 4
3 w no x 2 2
4 y yes z 5 25