【发布时间】:2022-01-18 02:14:48
【问题描述】:
我有一个关于这个问题的跟进:Sum values from rows with conditions in R
这是我的数据:
ID <- c("A", "B", "C", "D", "E", "F")
Q1 <- c(0, 1, 7, 9, NA, 3)
Q2 <- c(0, 3, 2, 2, NA, 3)
Q3 <- c(0, 0, 7, 9, NA, 3)
dta <- data.frame(ID, Q1, Q2, Q3)
我需要对低于 7 的每个值求和,但在值超过 7 的行中,我需要对所有低于 7 的数字求和并忽略超过它的数字。应保留具有所有 NA 的行。结果应如下所示:
ProxySum
0
4
2
2
NA
9
我已经根据上一篇文章的回复尝试了这段代码:
dta2 <- dta %>%
rowwise() %>%
mutate(ProxySum = ifelse(all(c_across(Q1:Q3) < 7), Reduce(`+`, c_across(Q1:Q3)), (ifelse(any(c_across(Q1:Q3) > 7), sum(.[. < 7]), NA))))
但在数字超过 7 的行中,我最终得到所有行和列的总和。我错过了什么?
【问题讨论】:
-
您的示例数据不起作用 - 您需要在字母周围加上引号,并且
NA需要大写。 -
添加到@GregorThomas 评论。请注意编码风格:逗号后的空格,vars 的小写名称,函数名和左括号之间没有空格,管道旨在使代码更具可读性 - 将您的调用放在管道之后的新行,嵌套
ifelse通话令人困惑。此外,您无需创建变量,只需调用data.frame()即可。可以使用data.frame(x = ..., y = ...)。您不需要as.data.frame(),而是需要data.frame()。 -
Nattys,不要太担心那些样式建议 - 虽然有用,但它们并不是完全必要的。关于
as.data.frame- 请在您的控制台中尝试此操作,检查它返回的内容。如果你想使用as.data.frame(你可以),你应该使用as.data.frame(list(ID,Q1,Q2,Q3)) -
@tjebo 样式对于代码的评估不是必需的,但对于可读性非常重要。明确的提问方式,是正确答案的一半。我不明白如何代码的最后一行很清楚,为什么它比格式清晰的代码更好。某人可以做某事这一事实并不意味着某人应该去做。没有理由把裤子戴在头上,也没有理由在这里使用
as.data.frame()和额外的变量赋值。做你不应该做的事,仅仅因为你能做到,这就是罪的定义:)。 -
谢谢大家的造型技巧,我会更加注意,我知道可读性很重要。至于没有引号的 ID 列,你是对的,我创建示例时忘记添加它们。我不是一个很有经验的用户,仍然犯了很多错误