我对这个问题进行了跟进: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 的数字求和并忽略大于 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 的行中,我最终得到所有行和列的总和。我缺少什么?
最佳答案
base
中的一种方法:
rowSums(dta[, 2:4] * (dta[, 2:4] < 7))
# [1] 0 4 2 2 NA 9
根据@tjebo 评论添加解释
dta[, 2:4] < 7
您生成了一个填充有 logical
的数据框值,其中 TRUE
或 FALSE
对应于 小于 或大于 7
的值.可以在一行中完成,因为此操作是矢量化的;logical
输入 numeric
类型,所以所有 FALSE
和 TRUE
来自逻辑 数据集的 s 被转换为 0
s 和 1
秒。这意味着您将原始值乘以 1
如果它们小于 7
,并通过 0
否则;NA < 7
生产 NA
,然后乘以 NA
将产生 NA
同样 - 您保留原始的 NA
;rowSums()
在生成的数据帧上,它将总结每个特定行的值。因为他们中的那些超过7
变成了0
s,您将它们从结果总和中排除;NA
,你可以使用 na.rm = TRUE
你的论点 rowSums()
称呼。但是,在这种情况下,对于带有 NA
的行只有你会得到0
.https://stackoverflow.com/questions/70354447/