Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dplyr-使用列索引而不是列名将列输入到rowwise()_R_Dplyr_Tidyverse - Fatal编程技术网

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(...))))