2015-01-16 65 views
1

我明白这是一个相当简单的问题,但我一直无法找到答案。根据R中的列值计算行的频率

我有一个数据框,它给你一个人的id和他的爱好。由于一个人可能有许多爱好,所以id字段可以重复多行,每个行都有不同的爱好。我一直在试图打印出只有那些有多种爱好的行。我能够使用获得频率。

  1. 但是,如何仅在频率大于1时才应用条件打印。其次,有没有更好的方法来查找频率,而不使用表格。

这是我尝试用表,而过滤器的频率大于一

> id=c(1,2,2,3,2,4,3,1) 
> hobby = c('play','swim','play','movies','golf','basketball','playstation','gameboy') 
> df = data.frame(id, hobby) 
> table(df$id) 

1 2 3 4 
2 3 2 1 
+3

'tbl < - table(df $ id); tbl [tbl> 1]' –

+0

你想过滤数据吗?或频率表? –

+0

谢谢@RichardScriven,我会继续这个。为了增加它,有没有一种方法可以在没有频率的情况下在数据框中单独获取ID? – IAMTubby

回答

3

使用数据表的尝试,我发现它比使用表更具可读性()函数:

library(data.table) 
id=c(1,2,2,3,2,4,3,1) 
hobby = c('play','swim','play','movies', 
      'golf','basketball','playstation','gameboy') 
df = data.frame(id=id, hobby=hobby) 
dt = as.data.table(df) 
dt[,hobbies:=.N, by=id] 

您将得到,为您的条件:

> dt[hobbies >1,] 
    id  hobby hobbies 
1: 1  play  2 
2: 2  swim  3 
3: 2  play  3 
4: 3  movies  2 
5: 2  golf  3 
6: 3 playstation  2 
7: 1  gameboy  2 
+1

另一种不分配新列的方法dt [,。(hobby [.N> 1],.N [.N> 1]),by = id]'然后它也出来订购 –

+0

@RichardScriven,真的很酷,如果不太可读!但是恐怕它会在您编写它时重新命名列。 –

+2

对,对不起'dt [,。(hobby = hobby [.N> 1],N = .N [.N> 1]),by = id]'应该会更好 –

1

这个例子假设你正试图DF

id=c(1,2,2,3,2,4,3,1) 
hobby = c('play','swim','play','movies','golf','basketball', 
'playstation','gameboy') 
df = data.frame(id, hobby) 
table(df$id) 

过滤获取所有那些有不止一个爱好

tmp <- as.data.frame(table(df$id)) 
tmp <- tmp[tmp$Freq > 1,] 

使用该信息的标识 - 在DF选择它们的ID

df1 <- df[df$id %in% tmp$Var1,] 
df1