我正在尝试查找某些列中的值的平均值,并将其附加到新列中。
我有一个包含字符元素列表的变量,这些元素对应于某些列名。例如,
qcs <- list.files(qcDirectory)
str(qcs)
chr [1:5] "201701" "201702" "201703" "201704"
这是一个示例数据表:
201701 201702 201703 201704
row1 12 20 50 54
row2 15 23 45 35
row3 16 20 52 58
row4 17 13 47 48
例如,我想得到名为“201701”和“201702”的列中包含的值的平均值,因此预期的输出将是:
201701 201702 201703 201704 mean
row1 12 20 50 54 16
row2 15 23 45 35 19
row3 16 20 52 58 18
row4 17 13 47 48 15
我不能将它应用于前x个列,因为它们可以出现在表格的任何位置。我认为lapply可能是要走的路,但我不确定如何让它工作。用简单的英语,我基本上希望函数是“对于这个变量[qcs]中包含的所有列名,找到这些值的平均值。”不确定我是否需要某种循环,或者是什么。我确定答案已经存在,但我是一个菜鸟,并且无法尝试应用this和this等类似帖子。我正在想一些模糊的东西,比如我下面的内容,它可以成功识别正确的列进行操作,但这只是平均每列中的值并输出一个列表,而不是平均相关列的行和将它们放入新专栏。任何想法都表示赞赏。
sapply(colnames(datamatrix), function(c) {
if (c %in% qcs) datamatrix$mean = mean(test1[, c])
})
答案 0 :(得分:1)
这是你可以做的。将感兴趣的列存储在矢量col中,如下所示。然后使用apply。
col=c('201701','201702')
df$mean=apply(df[,col],1,mean)
答案 1 :(得分:1)
这应该是一种适合您情况的策略,因为(据我所知)您可能想要为几个不同的列组合计算它。
使用iris
数据集进行说明:假设您要添加一个新列,对于每一行,该列是相应行的"Sepal.Width"
和"Petal.Width"
列中值的平均值。这是一个包含相关列名的向量(这里它们是由列名中的模式选择的,就像我理解的那样)。
data(iris)
cname_pattern <- "Width"
target_cols <- grep(cname_pattern, names(iris), value=TRUE)
然后你可以说
iris[[paste0(cname_pattern, "_mean")]] <- rowMeans(iris[, target_cols])
您将获得新列中每行的相关列的平均值。这应该足够灵活,以适应手头的情况。可能希望在na.rm=TRUE
中使用rowMeans()
,如果可能的话,那里的任何地方都会丢失值。
答案 2 :(得分:1)
使用dplyr
并假设df
作为您的数据表,您可以执行以下操作:
select(df,c(201701,201702)) %>% summarise_all(mean)
dplyr
为您提供了更多选择群组列的灵活性,因为您可以使用matches
,starts_with
,contains
等帮助程序。
答案 3 :(得分:0)
你不需要循环:
datamatrix$mean = rowMeans(datamatrix[,qcs])