在R中的数据框中用它们的均值替换值

时间:2011-10-08 21:23:22

标签: r

我需要在数据框中用它们的均值替换两个副本(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)
}

主要问题是:

  1. 这样我只有新数据框中的最后一行(foo)和
  2. 我没有任何专栏中的样本名称。
  3. 你有什么建议吗?

3 个答案:

答案 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的列。