2012-08-04 81 views
0

我不能爲我的生活找出這裏發生了什麼。我有一個有數千行的數據框。其中一列是「名稱」,其他列有各種因素。我試圖計算每個「名稱」有多少個唯一的行(即多組因素)。For循環不正確計數

這裏是我運行一個腳本循環:

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] 
} 

當我從控制檯運行在該線環和替換「我」與任意數量(即10,27, 40,...),它給了我正確的計數。但是當我在for循環中運行這條線時,最終的結果是計數都是一樣的。我無法弄清楚它爲什麼不起作用。有任何想法嗎?

回答

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)))) 
+0

我並沒有執着於for循環,所以我會採取一攬子計劃!謝謝。 – 2012-08-04 22:23:09

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)))