我有这样的数据集
data
name v1 v2 v3 v4 v5
a 1 2 7 9 3
b 3 8 6 4 8
c 2 5 0 1 9
a 6 0 6 2 1
c 3 9 4 7 5
Run Code Online (Sandbox Code Playgroud)
name是一个因子变量.我想v2,v3,v4,v5用因子计算平均值data$name.我使用了以下命令,但它没有用.
tapply(data[,3:6],data$name,mean)
Run Code Online (Sandbox Code Playgroud)
现在,我使用了以下代码
newdata<-0
for (name in unique(data$name)){
rowIndex <- which(data$name == name)
result <- colMeans(data[rowIndex,])
newdata[name,]<-result
}
Run Code Online (Sandbox Code Playgroud)
获得所需的结果.但我想知道是否有一些光滑的方法来做到这一点.
这是另一种方式
library(data.table)
cols <- paste0("v", 2:5) # set the columns you want to operate on
setDT(data)[, Sums := rowSums(.SD), .SDcols = cols]
data[, list(Means = sum(Sums)/(.N*length(cols))), by = name]
## name Means
## 1: a 3.75
## 2: b 6.50
## 3: c 5.00
Run Code Online (Sandbox Code Playgroud)
编辑
根据@Aruns的建议,这可能会好得多
setDT(data)[, mean(c(v2,v3,v4,v5)), by=name]
## name V1
## 1: a 3.75
## 2: b 6.50
## 3: c 5.00
Run Code Online (Sandbox Code Playgroud)
或者根据@Anandas的建议
library(reshape2)
melt(setDT(data), id.vars = "name", measure.vars = cols)[, mean(value), by = name]
## name V1
## 1: a 3.75
## 2: b 6.50
## 3: c 5.00
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4182 次 |
| 最近记录: |