合并(合并)部分匹配标题名称的列

4

我有一个类似于以下格式的数据:

   AAA_1   AAA_2  AAA_3  BBB_1  BBB_2  BBB_3 CCC
1   1       1      1       2     2      2     1
2   3       1      4       0     0      0     0
3   5       3      0       1     1      1     1

对于每一行,我想要对具有共同特征的列进行平均值计算,如下所示:

feature <- c("AAA","BBB","CCC")

所需输出应如下所示:
   AAA   BBB   CCC
1   1       2   1
2   2.6     0   0
3   2.6     1   1

针对每个模式,我能够独立完成:

data <- read.table("data.txt",header=T,row.name=1)
AAA <- as.matrix(rowMeans(data[ , grepl("AAA" , names( data ) ) ])

但我不知道如何在一行中为不同的模式进行部分匹配

我还尝试了其他一些方法,例如:

for (i in 1:length(features)){
feature[i] <- as.matrix(rowMeans(data[ , grepl(feature[i] , names( data ) ) ]))
}

请问您能否让您的示例可重现吗?同时,请阅读此链接(https://dev59.com/eG025IYBdhLWcg3whGSx)。 - Sotos
3个回答

2

这里有另一个选项。根据您的列模式,我选择使用gsub()函数并获取前三个字母。使用包括AAA、BBB和CCC的ind,我使用lapply()函数,对每个ind元素的数据进行子集化,计算行平均值,并仅提取行平均值的一列。然后,我使用bind_cols()函数并创建了foo。最后一步是为foo指定列名。

library(dplyr)

ind <- unique(gsub("_\\d+$", "", names(mydf)))

lapply(ind, function(x){
    select(mydf, contains(x)) %>%
    transmute(out = rowMeans(.))
    }) %>%
bind_cols() %>%
add_rownames -> foo

names(foo) <- ind

#       AAA   BBB   CCC
#     (dbl) (dbl) (dbl)
#1 1.000000     2     1
#2 2.666667     0     0
#3 2.666667     1     1

数据

mydf <- structure(list(AAA_1 = c(1L, 3L, 5L), AAA_2 = c(1L, 1L, 3L), 
AAA_3 = c(1L, 4L, 0L), BBB_1 = c(2L, 0L, 1L), BBB_2 = c(2L, 
0L, 1L), BBB_3 = c(2L, 0L, 1L), CCC = c(1L, 0L, 1L)), .Names = c("AAA_1", 
"AAA_2", "AAA_3", "BBB_1", "BBB_2", "BBB_3", "CCC"), class = "data.frame", row.names = c(NA, 
-3L))

相同的概念,不同的执行方式 :) - Sotos
@Sotos 是的,看起来我们正在同一时间以同样的方式工作。 :) - jazzurro
谢谢。我该如何保留行名称? - user6013305
@user6013305 你需要将行名作为一列吗? - jazzurro
@user6013305 дҢ еЏҮд»ӨеѓЏThierryе»ғи®®зљ„й‚Әж ·дҢүз”Ёadd_rownames()。如жһњењЁbind_cols()之еђҺж·»еЉ %>%add_rownamesпәЊж€‘认дёғдҢ дәљең—е€°дёЂдёҒеё¦жњ‰иҰЊеђҚз§°зљ„е€—гЂ‚ - jazzurro
显示剩余3条评论

2
假设你的colnames总是按照示例所示结构化的,那么你可以将名称拆分并聚合。
new_names <-  unlist(strsplit(names(df),"\\_.*"))
colnames(df) <- new_names
#Testing with your data, we need to prevent the loss of dimension by using drop = FALSE  
sapply(unique(new_names), function(i) rowMeans(df[, new_names==i, drop = FALSE]))
#          AAA BBB CCC
#[1,] 1.000000   2   1
#[2,] 2.666667   0   0
#[3,] 2.666667   1   1

数据:

df <- structure(list(AAA_1 = c(1L, 3L, 5L), AAA_2 = c(1L, 1L, 3L), 
AAA_3 = c(1L, 4L, 0L), BBB_1 = c(2L, 0L, 1L), BBB_2 = c(2L, 
0L, 1L), BBB_3 = c(2L, 0L, 1L), CCC = c(1L, 0L, 1L)), .Names = c("AAA_1", 
"AAA_2", "AAA_3", "BBB_1", "BBB_2", "BBB_3", "CCC"), class = "data.frame", row.names = c(NA, 
-3L))        

1
library(dplyr)
library(tidyr)
data %>%
  add_rownames() %>%
  gather("variable", "value", -rowname) %>%
  mutate(variable = gsub("_.*$", "", variable)) %>%
  group_by(rowname, variable) %>%
  summarise(mean = mean(value)) %>%
  spread(variable, mean)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接