0

ここで何が起こっているのか理解できません。数千行のデータフレームがあります。列の1つは「名前」であり、他の列にはさまざまな要素があります。各「名前」に属する一意の行(つまり、因子のセット)の数を数えようとしています。

スクリプトとして実行しているループは次のとおりです。

names<-as.matrix(unique(all.rows$name))
count<-matrix(1:length(names))
for (i in 1:length(names)) {
  count[i]<-dim(unique(subset(all.rows,name==names[i])[,c(1,3,4,5)]))[1]
}

コンソールからforループの行を実行し、「i」を任意の数値(つまり、10、27、40、...)に置き換えると、正しいカウントが得られます。しかし、この行をforループ内で実行すると、最終的にはカウントがすべて同じになります。なぜ機能しないのかわかりません。何か案は?

4

2 に答える 2

2

これは、はるかに単純なコードで実行できます。各行の因子値を貼り付けてから、を使用してみてくださいtapply。実例は次のとおりです。

data(trees)
trees$name <- rep(c('elm', 'oak'), length.out = nrow(trees))
trees$HV   <- with(trees, paste(Height, Volume))
tapply(trees$HV, trees$name, function (x) length(unique(x)))

最後のコマンドは、必要なカウントを提供します。私が知る限り、あなたの変数名を与えられた類似のコードは

all.rows$factorCombo <- apply(all.rows[, c(1, 3:5)], 2, function (x) paste(x, collapse = ''))
tapply(all.rows$factorCombo, all.rows$name, function (x) length(unique(x)))
于 2012-08-04T19:54:35.663 に答える
2

あなたのコードは私のために働きます:

# Sample data.
set.seed(1)
n=10000
all.rows=data.frame(a=sample(LETTERS,n,replace=T),b=sample(LETTERS,n,replace=T),name=sample(LETTERS,n,replace=T))

names<-as.matrix(unique(all.rows$name))
count<-matrix(1:length(names))
for (i in 1:length(names)) {
  count[i]<-dim(unique(subset(all.rows,name==names[i])[,c(1,2)]))[1]
}
t(count)

forループを使い続けたい場合、これはもう少し明確です。

count<-c()
for (i in unique(all.rows$name)) 
  count[i]<-nrow(unique(all.rows [all.rows$name==i,names(all.rows)!='name']))
count

しかし、使用byすることは非常に簡潔です:

c(by(all.rows,all.rows$name,function(x) nrow(unique(x))))
于 2012-08-04T20:23:28.923 に答える