R列表示因子

Pra*_*bhu 5 r

我有这样的数据集

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)

获得所需的结果.但我想知道是否有一些光滑的方法来做到这一点.

Dav*_*urg 6

这是另一种方式

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)

  • 或者`data [,mean(c(v2,v3,v4,v5)),by = name]`.如果有更多列,我们可以构造一个表达式并对其进行评估. (3认同)
  • 我不知道`.SD`和`melt`之间的权衡,但是`melt(setDT(data),id.vars ="name",measure.vars = cols)[,mean(value),by = name ]"也许吧? (2认同)