【发布时间】:2019-01-30 22:47:26
【问题描述】:
我正在尝试创建一个新列,该列将包含对 tibble 列的子集逐行执行的计算结果,并且将此新列添加到现有 tibble。像这样:
df <- tibble(
ID = c("one", "two", "three"),
A1 = c(1, 1, 1),
A2 = c(2, 2, 2),
A3 = c(3, 3, 3)
)
我实际上想从基础 R 中执行此代码的 dplyr 等效:
df$SumA <- rowSums(df[,grepl("^A", colnames(df))])
我的问题是这不起作用:
df %>%
select(starts_with("A")) %>%
mutate(SumA = rowSums(.))
# some code here
...因为我去掉了“ID”列,以便让 mutate 在其他(数字)列上运行 rowSums。我试图在变异后在管道中 cbind 或 bind_cols ,但它不起作用。 mutate 的任何变体都不起作用,因为它们在原地工作(在 tibble 的每个单元格内,而不是跨列,即使是按行)。
这确实有效,但我认为这不是一个优雅的解决方案:
df %>%
mutate(SumA = rowSums(.[,grepl("^A", colnames(df))]))
是否有任何基于 tidyverse 的解决方案,不需要 grepl 或方括号,而只需要更标准的 dplyr 动词和参数?
我的预期输出是这样的:
df_out <- tibble(
ID = c("one", "two", "three"),
A1 = c(1, 1, 1),
A2 = c(2, 2, 2),
A3 = c(3, 3, 3),
SumA = c(6, 6, 6)
)
最好的 千焦
【问题讨论】:
-
哇,谢谢大家,那里有很多很棒的想法 - 很难选择首选答案。我喜欢 Callum You 的 pmap(尽管 reduce 仍然让我感到困惑 :-),我喜欢 G. Grothendieck 的嵌套管道(我不知道你能做到这一点)和 utubun 的 Callum You 解决方案的简化版本。跨度>