获取具有特定名称

时间:2017-11-15 03:37:11

标签: r

我正在尝试查找某些列中的值的平均值,并将其附加到新列中。

我有一个包含字符元素列表的变量,这些元素对应于某些列名。例如,

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]中包含的所有列名,找到这些值的平均值。”不确定我是否需要某种循环,或者是什么。我确定答案已经存在,但我是一个菜鸟,并且无法尝试应用thisthis等类似帖子。我正在想一些模糊的东西,比如我下面的内容,它可以成功识别正确的列进行操作,但这只是平均每列中的值并输出一个列表,而不是平均相关列的行和将它们放入新专栏。任何想法都表示赞赏。

sapply(colnames(datamatrix), function(c) {
  if (c %in% qcs) datamatrix$mean = mean(test1[, c])
}) 

4 个答案:

答案 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为您提供了更多选择群组列的灵活性,因为您可以使用matchesstarts_withcontains等帮助程序。

答案 3 :(得分:0)

你不需要循环:

datamatrix$mean = rowMeans(datamatrix[,qcs])