最小示例:一个包含 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)
我在做什么,我该如何解决这个问题?
提前谢谢了
托马斯·菲利普斯
由于您没有提供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)