根据列表中的名称获取平均值的简便方法

时间:2012-10-19 13:54:48

标签: r

有没有简单的方法可以根据名称获取列表中项目的平均值?示例数据集:

sampleList <- list("a.1"=c(1,2,3,4,5), "b.1"=c(3,4,1,4,5), "a.2"=c(5,7,2,8,9), "b.2"=c(6,8,9,0,6))
sampleList
$a.1
[1] 1 2 3 4 5

$b.1
[1] 3 4 1 4 5

$a.2
[1] 5 7 2 8 9

$b.2
[1] 6 8 9 0 6

我要做的是获取相似但不具有相同名称的行之间的列平均值,输出包含a'sb's的列平均值的列表。目前我可以做到以下几点:

y <- names(sampleList)
y <- gsub("\\.1", "", y)
y <- gsub("\\.2", "", y)
y <- sort(unique(y))
sampleList <- t(as.matrix(as.data.frame(sampleList)))
t <- list()
for (i in 1:length(y)){
   temp <- sampleList[grep(y[i], rownames(sampleList)),]
   t[[i]] <- apply(temp, 2, mean)
}

t
[[1]]
[1] 3.0 4.5 2.5 6.0 7.0

[[2]]
[1] 4.5 6.0 5.0 2.0 5.5

我有一个包含大量相似名称的大型数据集,是否有更简单的方法可以解决这个问题?

编辑:我已将名称问题分解为一个单独的问题。可以找到here

2 个答案:

答案 0 :(得分:6)

嗯,这是更短。你没有确切地说出你的实际数据究竟有多大,所以我不会做出任何承诺,但这样做的表现应该不会太糟糕:

dat <- do.call(rbind,sampleList)
grp <- substr(rownames(dat),1,1)

aggregate(dat,by = list(group = grp),FUN = mean)

(编辑删除不必要的数据框转换,可能会导致性能大幅下降。)

如果您的数据疯狂大,或者甚至只是中等大,但群组的数量相当大,因此每组中有少量向量,标准建议是调查一旦您将数据data.table编入矩阵,就会rbind

答案 1 :(得分:4)

我可能会这样做:

# A *named* vector of patterns you want to group by
patterns <- c(start.a="^a",start.b="^b",start.c="^c")
# Find the locations of those patterns in your list
inds <- lapply(patterns, grep, x=names(sampleList))
# Calculate the mean of each list element that matches the pattern
out <- lapply(inds, function(i) 
  if(l <- length(i)) Reduce("+",sampleList[i])/l else NULL)
# Set the names of the output
names(out) <- names(patterns)