在处理数据框表时,我还没有找到一种方法来求R中某些列的平均值。基本上,我想取3个控件(CTR_R1+CTR_R2+CTR_R3)的平均值,并将该值作为紧跟在CTR_R3后面的另一列插入(见下文)。TRT也是如此。是否可以取平均值并将其插入到特定位置?
GeneID|CTR_R1|CTR_R2|CTR_R3|CTR_AVG|TRT_R1| TRT_R2| TRT_R3|TRT_AVG|pValue发布于 2014-10-31 20:58:37
即使有许多CTR或TRT列(即100列),下面的代码也应该可以工作。但是,我猜@初学者的解决方案会更快。
indx <- grep("^CTR", colnames(df1), value=TRUE)
indxT <- grep("^TRT", colnames(df1), value=TRUE)
df1[,c('CTR_Avg', 'TRT_Avg')] <- lapply(list(indx, indxT),
function(x) Reduce(`+`, df1[,x])/length(x))或者,您可以在上面的步骤中使用rowMeans。
df2 <- df1[,c('GeneID', indx, 'CTR_Avg', indxT, 'TRT_Avg', 'pValue')]
head(df2,2)
# GeneID CTR_R1 CTR_R2 CTR_R3 CTR_Avg TRT_R1 TRT_R2 TRT_R3 TRT_Avg pValue
#1 1 6 2 10 6.000000 10 11 15 12 0.091
#2 2 5 12 8 8.333333 5 3 13 7 0.051数据
set.seed(24)
df1 <- as.data.frame(matrix(sample(1:20,20*6, replace=TRUE), ncol=6))
colnames(df1) <- c("CTR_R1", "CTR_R2", "CTR_R3", "TRT_R1", "TRT_R2", "TRT_R3")
df1 <- cbind(GeneID=1:20, df1,
pValue=sample(seq(0.001, 0.10, by=0.01), 20, replace=TRUE))发布于 2014-10-31 21:00:08
如果您的data.frame名为df,则此代码应该可以为您工作
df$CTR_AVG <- ( df$CTR_R1 + df$CTR_R2 + df$CTR_R3 ) / 3这是假设CTR_AVG列已经存在,如您在问题中所示。如果没有,代码将把该列放在data.frame的末尾。要将其移动到正确的位置,您需要按正确的顺序选择列,如下所示:
df[ , c( 'GeneID', 'CTR_R1', 'CTR_R2', 'CTR_R3', 'CTR_AVG', 'TRT_R1', 'TRT_R2', 'TRT_R3','TRT_AVG','pValue' ] 发布于 2014-10-31 21:04:26
怎么样
df$CTR_AVG <- rowMeans(df[,2:4])
df$TRT_AVG <- rowMeans(df[,6:8])https://stackoverflow.com/questions/26675166
复制相似问题