0

我一生都无法弄清楚这里发生了什么。我有一个包含数千行的数据框。其中一列是“名称”,其他列有各种因素。我试图计算有多少独特的行(即因子集)属于每个“名称”。

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

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 回答