2013-08-18 49 views
3

我有一個df,我想刪除df中少於X行的人。例如,在這個玩具的例子中,我想保留有5行以上的人。刪除出現x次的ID R

df 
    names fruit 
4 john kiwi 
7 john apple 
9 john banana 
13 john orange 
14 john apple 
2 mary orange 
5 mary apple 
8 mary orange 
10 mary apple 
12 mary apple 
1 tom apple 
3 tom banana 
6 tom apple 
11 tom kiwi 

例如輸出

df 
    names fruit 
4 john kiwi 
7 john apple 
9 john banana 
13 john orange 
14 john apple 
2 mary orange 
5 mary apple 
8 mary orange 
10 mary apple 
12 mary apple 

提前感謝!

回答

5

您可以使用table這樣的:

df[df$names %in% names(table(df$names))[table(df$names) >= 5],] 
+1

優秀的東西。謝謝。只是要強調一下,在%%之後直接出現的「名稱」是該函數語法的一部分,並且不會引用df中名爲「names」的列。 – user2363642

3

這裏有一個data.table解決方案使用內置.N值,這是因爲在?data.table幫助文件中描述:‘.N’ is an integer, length 1, containing the number of rows in the group.

#create a similar reproducible exmaple 
library(data.table) 
dat <- data.table(names=rep(letters[1:3],c(5,5,3)),var=1:13) 

刪除行:

dat[, cnt:=.N, by=names][cnt >= 5] 

雖然我覺得必須有辦法做到這一點,而不需要指定一個新的變量。 ...現在有感謝的意見@mnel:

dat[,if(.N>=5).SD,by=names] 

這實質上返回子data.table爲by組的每個值,如果行的組.N的數量爲.SD大於或等於5.它幾乎等於更傳統的R子集語法:

dat[,.SD[.N >= 5],by=names] 
+3

'dat [,if(.N> = 5).SD,by = names]' – mnel

+1

@Mnel非常重要。在'j'中使用'if'語句的好處是避免了子句計算結果爲'FALSE'時調用'.SD'的開銷 –