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