组合 mutate(across) 和 case_when 以根据条件用 0 填充多个列

combine mutate(across) and case_when to fill multiple columns with 0 depending on condition

在 dplyr 工作流程中,当 newvar == 0 时,我尝试在 dataframe 的每一列中的 newvar 列之后粘贴一个 0,否则什么也不做。 我修改了鸢尾花数据集:

library(dplyr)
n <- 150 # sample size

iris1 <- iris %>% 
    mutate(id = row_number(), .before = Sepal.Length) %>% 
    mutate(newvar = sample(c(0,1), replace=TRUE, size=n), .before = Sepal.Length ) %>% 
    mutate(across(.[,3:ncol(.)], ~ case_when(newvar==0 ~ 0)))

我尝试了像这里这样的解决方案 How to combine the across () function with mutate () and case_when () to mutate values in multiple columns according to a condition?。 我的理解:

  1. with .[,3:ncol(.)] 我浏览了 newvar 列之后的列。
  2. withcase_when(newvar==0我试着设置条件
  3. with ~ 0 after newvar==0 如果条件满足,我试着说粘贴 0。

我知道我做错了什么,但我不知道是什么!感谢您的帮助。

.[,3:ncol(.)] 是列的值,而不是实际的列号。使用 3:ncol(.) 应该可以正常工作。

一般来说,最好避免按位置引用列,而是使用它们的名称。您可以在一次 mutate 调用中完成此操作。

library(dplyr)

n <- 150

iris %>% 
  mutate(id = row_number(), 
        newvar = sample(c(0,1), replace=TRUE, size=n), 
        across(Sepal.Length:Petal.Width, ~ case_when(newvar==0 ~ 0, 
                                                     newvar == 1 ~ .)))