2

名前に基づいてリスト内のアイテムの平均を取得する簡単な方法はありますか? データセットの例:

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'sですb'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

AI には、類似した名前のセットが多数含まれる大規模なデータセットがあります。これを行う簡単な方法はありますか?

編集:名前の問題を別の質問に分割しました。ここで見つけることができます

4

2 に答える 2

6

まあ、これは短いです。あなたは実際のデータの大きさを正確に述べていないので、約束はしませんが、これのパフォーマンスはひどいものではありません:

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

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

(データ フレームへの不要な変換を削除するために編集されました。これにより、パフォーマンスが大幅に低下する可能性があります。)

データが非常に大きい場合または中規模の場合でも、グループの数がかなり多いため、各グループのベクトルの数が少ない場合、データをマトリックスに編集した後で調査することをお勧めしdata.tableますrbind.

于 2012-10-19T14:10:20.573 に答える
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)
于 2012-10-19T14:31:36.677 に答える