我不能为我的生活弄清楚这里发生了什么。我有一个有几千行的数据框。其中一列是“名称”,其他列有各种因素。我正在尝试计算每个“名称”中有多少个唯一行(即因子组)。
这是我作为脚本运行的循环:
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循环中运行这一行时,最终结果是计数都是相同的。我无法弄清楚为什么它不起作用。有什么想法吗?
答案 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))))