2013-04-22 71 views
0

如果我有一个包含一列,名称和另一个站点的数据框,并且我想确定站点关系唯一名称的数量。删除r中数据帧的两列之间冗余的更好方法

我写了下面的脚本。它的工作原理,但感觉bodged,是我真实的数据慢:

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

为什么你觉得有必要循环? '长度(唯一(paste0(df $ name,df $ site)))'应该完成这项工作。 – Roland 2013-04-22 14:06:12

+0

非常感谢!这是因为df的真实版本有很多列,而不仅仅是两列,所以我对此有点困惑和奇怪。再次感谢。 – 2013-04-22 14:15:01

+1

'table(df $ name,df $ site)'也应该有助于找到这个关系(可能对您的问题不是直截了当的)。 – Arun 2013-04-22 14:50:23

回答

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 
1

你并不需要一个for循环,只是做:

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

甚至更​​短的(我觉得快得)是:

nrow(unique(df)) 
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 
+0

对于我想了解我的数据的其他内容,这真的很棒,所以谢谢! – 2013-04-22 15:04:56