【发布时间】:2021-03-19 11:33:17
【问题描述】:
最小示例:一个包含 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)
)
这给了我对各种问题的回答的数据框:
> 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
我还定义了以下常量:
QUESTIONS <- c("Q1”, “Q2”, “Q3”, “Q4")
MY_NEW_COL <- "New_Col"
THESHOLD1 <- 5
THESHOLD2 <- 2
我想添加一个名为 New_Col 的新列,如果超过 THRESHOLD2 列的值超过 THRESHOLD1,则该列为 TRUE。我可以让它以一种笨拙但显而易见的方式工作:
df1 %>%
mutate(!!MY_NEW_COL := ( (Q1 > THREHOLD1) + (Q2> THREHOLD1) +
(Q3 > THREHOLD1) + (Q4> THREHOLD1) ) > THRESHOLD2)
这给出了正确的答案:
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
但我想把这个系统化一下,因为总共有 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
我在做什么,我该如何解决这个问题?
在此先感谢
托马斯·飞利浦
【问题讨论】:
-
我一直在查看您的代码,在发布答案之前,我想在这里解决您对
QUESTIONS的定义的问题。你的引号破坏了你的代码,你应该使用“或',没有其他东西来定义字符串。QUESTIONS <- c("Q1", "Q2", "Q3", "Q4") -
我无法运行您的代码
df1 %>% mutate(!!MY_NEW_COL := ( (Q1 > THREHOLD1) + (Q2> THREHOLD1) + (Q3 > THREHOLD1) + (Q4> THREHOLD1) ) > THRESHOLD2)。它报告错误“错误:mutate()输入New_Col出现问题。未找到 x 对象 'THREHOLD1'”。 -
OP 的帖子中有不少拼写错误。这些都应该纠正。他定义了
THESHOLD1,但调用了THREHOLD1——这就是为什么你的代码不起作用@Peace Wang -
为错误道歉
-
这个问题怎么还没有选择的答案....