我需要在数据框中用它们的均值替换两个副本(A和B)的值。
这是数据框:
Sample.Name <- c("sample01","sample01","sample02","sample02","sample03","sample03")
Rep <- c("A", "B", "A", "B", "A", "B")
Rep <- as.factor(Rep)
joy <- sample(1000:50000000, size=120, replace=TRUE)
values <- matrix(joy, nrow=6, ncol=20)
df.data <- cbind.data.frame(Sample.Name, Rep, values)
names(df.data)[-c(1:2)] <- paste("V", 1:20, sep="")
这是我试图用平均值代替副本的循环:
Sample <- as.factor(Sample.Name)
livelli <- levels(Sample)
for (i in (1:(length(livelli)))){
estrai.replica <- which(df.data == livelli[i])
media.replica <- apply(values[estrai.replica,], 2, mean)
foo <- rbind(media.replica)
}
主要问题是:
你有什么建议吗?
答案 0 :(得分:4)
我认为你想要aggregate
你的数据框。试试这个:
aggregate(df.data, by=list(Sample.Name), FUN=mean)
答案 1 :(得分:2)
出于好奇,我尝试了一种基于tapply的解决方案。
# Not correct: lapply(df.data[-(1:3)], tapply, INDEX=df.data$Sample.Name, FUN=mean)
只需要as.data.frame
来“清理”。
# Not correct: as.data.frame(lapply(df.data[-(1:3)], tapply, INDEX=df.data$Sample.Name, FUN=mean))
编辑:就像@daroczig一样,我得到一个错误,抱怨说mean.default的trim参数不是长度为1.因此尝试添加更多参数形式的意思是尝试但只有当我还改为“[”的两个参数版本时我是否成功地满足了解释器,但仍未获得正确的功能应用程序分组。这个版本确实有效:
as.data.frame(lapply(df.data[, 3:22],
function(x) tapply(x, df.data$Sample.Name, FUN=mean)) )
答案 2 :(得分:1)
时间和内存效率的data.table
解决方案
library(data.table)
DT <- as.data.table(df.data)
DT[,lapply(.SD, mean),by = Sample.Name, .SDcols = paste0('V',1:20)]
请注意,.SD
是每个组的子集,.SDcols
定义了.SD
中要评估lapply
的列。