[英]dplyr - inputting columns to rowwise() with column index instead of column name
我找到了一个很好的解决方案,我想在这里创建一个新列来计算相应行中所有单元格的平均值:
https://stackoverflow.com/a/33438918/12744116
无可否认,数据并不整洁,但我在下面复制的解决方案可以完成工作:
data %>%
rowwise() %>%
mutate(c=mean(c(a,b)))
# id a b c
# (dbl) (dbl) (dbl) (dbl)
# 1 101 1 2 1.5
# 2 102 2 2 2.0
# 3 103 3 2 2.5
但是,与这个更简单的示例不同,我要命名的列太多了。 我想知道是否有任何方法可以使用切片符号快速引用列(即,而不是 c(a, b),类似于 2:3)或通过索引引用列的其他方式。
我在此处的另一个 Stack Overflow 线程上发现了类似的内容,但该解决方案有其自身的问题,因为我们列出了所有列索引而不是列名。 我的列太多了,无法为每个计算列出所有列。
任何解决方案?
编辑:我自己想出了一个,但我觉得它太不雅了,我相信我可能会为每一行提取整列,这显然比预期的解决方案要慢:
data %>%
mutate(id = row_number()) %>%
rowwise() %>%
mutate(avg = mean(c(.[id, 2:4], recursive=TRUE)))
任何更快的解决方案?
你可以做:
df %>%
mutate(c = rowMeans(select(., 2:3)))
id a b c
1 101 1 2 1.5
2 102 2 2 2.0
3 103 3 2 2.5
或者:
df %>%
mutate(c = rowMeans(select(., 2:length(.))))
对我来说,使用rowMeans
似乎很简单,不涉及tidyverse
函数。
data$c <- rowMeans(data[2:3])
但是,如果您更喜欢tidyverse
解决方案,我们可以从purrr
map
函数中获得一些帮助。
library(dplyr)
library(purrr)
仅用于两列
data %>% mutate(c = map2_dbl(a, b, ~mean(c(.x, .y))))
对于多列
data %>% mutate(c = pmap_dbl(select(., a:b), ~mean(c(...))))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.