对于循环计数不正确

时间:2012-08-04 19:33:33

标签: r for-loop

我不能为我的生活弄清楚这里发生了什么。我有一个有几千行的数据框。其中一列是“名称”,其他列有各种因素。我正在尝试计算每个“名称”中有多少个唯一行(即因子组)。

这是我作为脚本运行的循环:

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循环中的行并用任意数字(即10,27,40,...)替换“i”时,它给出了正确的计数。但是当我在for循环中运行这一行时,最终结果是计数都是相同的。我无法弄清楚为什么它不起作用。有什么想法吗?

2 个答案:

答案 0 :(得分: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)))

答案 1 :(得分: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))))