【问题标题】:How to mutate a mean of certain rows in a data frame如何改变数据框中某些行的平均值
【发布时间】:2018-03-19 16:17:00
【问题描述】:

我想创建一个新列,它等于我的数据框中几个变量(列)的平均值。但是,恐怕我不能使用“rowMeans”,因为我不想平均所有变量。此外,我对手动输入所有变量名(很多)犹豫不决。例如:

my_data <- data.frame(a = c(1,2,3), b = c(4,5,6), c = c(10,10,10), d = c(13,24,81),
                      e = c(10, 8, 6), hello = c(1,-1,1), bye = c(1,5,5))

我想改变一个名为 avg 的行,它只是变量 a、b、c、d 和 e 的平均值。因为在我的数据集中,变量名很长(而且很复杂),而且有10多个变量,我不想一一打出来。所以我想我可能需要使用 dplyr 包和 mutate 函数?您能否为我提出一个聪明的方法来做到这一点?

以下内容是在您的好心和答案建议之后添加的。再次感谢大家:

其实我需要的列名是Mcheck5_1_1, Mcheck5_2_1, ..., Mcheck5_8_1(所以一共有8个)。不过,我试过了 my_data$avg = rowMeans(select(my_data, Mcheck5_1_1:Mcheck5_8_1), na.rm = TRUE) 但是向我抛出了一个错误:

Error in select(my_data, Mcheck5_1_1:Mcheck5_8_1) : 
unused argument (Mcheck5_1_1:Mcheck5_8_1)

现在我使用以下代码解决了这个问题:

`idx = grep("Mcheck5_1_1", names(my_data))
my_data$avg = rowMeans(my_data[, idx:idx+7], na.rm = TRUE)`

但是有没有更优雅的方法呢?或者为什么我不能使用select()?谢谢!

【问题讨论】:

  • 你至少需要某种规则来获得你需要的变量。
  • dplyr 不是必须的,my_data$rowmn &lt;- rowMeans(my_data[,1:5]) 就足够了;或在 dplyr 中:my_data %&gt;% mutate(rowmn = rowMeans(.[1:5]))
  • 您提供了一个 data.frame 示例。你能用它来提供预期的输出吗?我对你到底想要什么感到困惑。
  • 亲爱的 Jaap, 非常感谢您的回复。变量名称为 Mcheck5_1_1 到 Mcheck5_8_1。是的,我可以使用 grep 函数对变量进行索引,并且我确切地知道需要聚合多少个变量。但是,我想的是 Mcheck5_1_1:Mcheck5_8_1。有可能做到吗?非常感谢!
  • 什么设置了您想要包含的变量和您想要排除的变量?列名?列类?列位置?别的东西?没有这些信息,就无法回答您的问题。一旦你知道了这一点,使用子集或 dplyr::select_helpers 实现你想要做的事情应该相对容易

标签: r mean dplyr


【解决方案1】:

我会做这样的事情

my_data <- data.frame(a = c(1,2,3), b = c(4,5,6), c = c(10,10,10), d = c(13,24,81),
                      e = c(10, 8, 6), hello = c(1,-1,1), bye = c(1,5,5))

several_variables <- c('a', 'b', 'c', 'd', 'e') #3 or `letters[1:5]`
my_data$avg <- rowMeans(my_data[,several_variables])
my_data
#>   a b  c  d  e hello bye  avg
#> 1 1 4 10 13 10     1   1  7.6
#> 2 2 5 10 24  8    -1   5  9.8
#> 3 3 6 10 81  6     1   5 21.2

显然,如果变量位于某个固定位置,并且您知道它们会停留在那里,您可以使用编号索引为suggested by Jaap

my_data$avg <- rowMeans(my_data[,1:5])

【讨论】:

    猜你喜欢
    • 2023-02-09
    • 2011-02-03
    • 2017-11-10
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    相关资源
    最近更新 更多