使用 dplyr 和 mutate 计算满足条件的列数

Tho*_*ips 3 r dplyr mutate

最小示例:一个包含 4 列的小数据框和一个保存我要创建的新列名称的变量。如果对超过一定数量的问题的回答超过阈值,则新列为 TRUE,否则为 FALSE

df1 <- data.frame(ID = LETTERS[1:5],
                  Q1 = sample(0:10, 5, replace=T),
                  Q2 = sample(0:10, 5, replace=T)
                  Q3 = sample(0:10, 5, replace=T)
                  Q4 = sample(0:10, 5, replace=T)
)
Run Code Online (Sandbox Code Playgroud)

这为我提供了对各种问题的回答的数据框:

> df1
  ID Q1 Q2 Q3 Q4
1  A  2  4  5  0
2  B  9  6  6  3
3  C  5  5  3  2
4  D  0  5  3 10
5  E  7  5  6  7
Run Code Online (Sandbox Code Playgroud)

我还定义了以下常量:

QUESTIONS  <- c("Q1”,  “Q2”,  “Q3”,  “Q4")
MY_NEW_COL <- "New_Col"
THESHOLD1  <- 5
THESHOLD2  <- 2
Run Code Online (Sandbox Code Playgroud)

New_Col如果多个THRESHOLD2列的值超过 ,我想添加一个名为TRUE的新列THRESHOLD1。我可以用一种笨拙但显而易见的方式让它工作:

df1 %>%
    mutate(!!MY_NEW_COL := ( (Q1 > THREHOLD1) + (Q2> THREHOLD1) +   
                             (Q3 > THREHOLD1) + (Q4> THREHOLD1)  ) > THRESHOLD2)
Run Code Online (Sandbox Code Playgroud)

这给出了正确的答案:

  ID Q1 Q2 Q3 Q4 New_Col
1  A  2  4  5  0   FALSE
2  B  9  6  6  3    TRUE
3  C  5  5  3  2   FALSE
4  D  0  5  3 10   FALSE
5  E  7  5  6  7    TRUE
Run Code Online (Sandbox Code Playgroud)

但我想把它系统化,因为总共有 17 个问题。我在下面显示的代码给出了错误的答案

df1 %>%
    mutate(!!MY_NEW_COL := sum(all_of(QUESTIONS) > THRESHOLD1)) > THRESHOLD2)

  ID Q1 Q2 Q3 Q4 New_Col
1  A  2  4  5  0    TRUE
2  B  9  6  6  3    TRUE
3  C  5  5  3  2    TRUE
4  D  0  5  3 10    TRUE
5  E  7  5  6  7    TRUE
Run Code Online (Sandbox Code Playgroud)

我在做什么,我该如何解决这个问题?

提前谢谢了

托马斯·菲利普斯

Ser*_*kan 5

由于您没有提供seed,因此无法准确重现您的结果。您问题的解决方案是使用across()and rowSums(),这样,

df1 %>%
    mutate(!!MY_NEW_COL := rowSums(across(QUESTIONS) > THESHOLD1) > THESHOLD2) 
Run Code Online (Sandbox Code Playgroud)

它给出了输出,

  ID Q1 Q2 Q3 Q4 New_Col
1  A  7  9  1  1   FALSE
2  B  3  9  9  7    TRUE
3  C  4  0  6  6   FALSE
4  D  5  1  6 10   FALSE
5  E  6  5  5  1   FALSE
Run Code Online (Sandbox Code Playgroud)