0

如果我有一个包含一列名称和另一列站点的数据框,并且我想确定唯一名称与站点关系的数量。

我编写了以下脚本。它可以工作,但对于我的真实数据来说感觉很慢并且速度很慢:

df = data.frame(name = c("dave", "bob", "dave", "john", "fred", "dave"), site = c(1,2,2,1,1,1))
redun = vector()
for (i in 1:length(df$name)){
  redun[i] = paste(df$name[i], df$site[i])
}
uniq = length(unique(redun))
4

3 回答 3

1

您可以使用聚合。这将方便地告诉您谁的名字有多少个独特的站点;

aggregate( site ~ name , data = df , function(x) length( unique(x) ) )
#  name site
#1  bob    1
#2 dave    2
#3 fred    1
#4 john    1

如果您想按名称知道有多少独特的网站,只需总结:

sum(aggregate( site ~ name , data = df , function(x) length( unique(x) ) )$site)
[1] 5
于 2013-04-22T14:22:37.360 回答
1

您不需要for循环,只需执行以下操作:

length(unique(with(df, paste(name, site))))

甚至更短(我认为也更快)是:

nrow(unique(df))
于 2013-04-22T14:07:28.717 回答
1

也许你想检查一下? duplicated

> duplicated( df )
[1] FALSE FALSE FALSE FALSE FALSE  TRUE
> sum( !duplicated( df ) )
[1] 5

编辑或根据您在原始帖子中的评论:

> duplicated( df[ c("name", "site" ) ] )
[1] FALSE FALSE FALSE FALSE FALSE  TRUE
> sum( !duplicated( df[ c("name", "site" ) ] ) )
[1] 5
于 2013-04-22T14:07:30.417 回答