2015-01-16 75 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