dplyr-使用列索引而不是列名将列输入到rowwise()
我找到了一个很好的解决方案,解决了一个问题,我想创建一个新的列,计算对应行中所有单元格的平均值: 诚然,数据并不整齐,但我在下面复制的解决方案完成了工作:dplyr-使用列索引而不是列名将列输入到rowwise(),r,dplyr,tidyverse,R,Dplyr,Tidyverse,我找到了一个很好的解决方案,解决了一个问题,我想创建一个新的列,计算对应行中所有单元格的平均值: 诚然,数据并不整齐,但我在下面复制的解决方案完成了工作: 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
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)或通过索引引用列的其他方式快速引用列
我在另一个堆栈溢出线程上发现了类似的情况,但解决方案有其自身的问题,因为我们列出的是所有列索引,而不是列名。我有太多的列,我列出他们所有的每一个计算
有什么解决办法吗
编辑:我自己找到了一个,但我觉得这太不雅观了,我相信我可能会为每一行提取整个列,这显然是一个比预期慢的解决方案:
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
或:
对我来说,使用
rowMeans
似乎很简单,不涉及tidyverse
函数
data$c <- rowMeans(data[2:3])
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(...))))
为什么不
rowMeans(数据[-1])
?@RonakShah你刚刚击败了我。如果它是所有列的简单平均值,但id
,则可以按原样使用他的解决方案。否则你可以传递列数的向量。@chinsoon12我想,当然,这对于一般知识来说是很好的,但我更喜欢一种在tidyverse中进行传递的方法。例如,我当然可以只使用rowmeans循环来计算答案。我更大的问题不在于如何获取行的意思本身——这正是导致我提出这个更大问题的一个具体例子——而是关于使用tidyverse中的rowwise()函数为列建立索引的一种有效方法;当然,这是可行的,但尽管某些计算确实需要它,但一般来说,一次计算整个向量的效率会低于R。我知道您正在使用rowMeans
作为了解如何以这种方式处理数据的方法,但是。。。也许您真正的问题也不需要按行执行
?
data %>% mutate(c = pmap_dbl(select(., a:b), ~mean(c(...))))