如何在数据框中的多对列中应用函数?

问题描述 投票:0回答:1

我想应用一个函数,该函数依赖于数据框中多对 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很快就会变得混乱。

如有任何帮助,我们将不胜感激!

r tidyverse
1个回答
0
投票

此方法依赖于文本和数字列的匹配对,仅此而已。

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
© www.soinside.com 2019 - 2024. All rights reserved.