2015-05-23 41 views
3

我有以下數據集。查找列中最常見的值並取其中的一個子集

Num    Day    Value 
1111    Thursday   2 
2222    Thursday   2 
3333    Thursday   3 
1111    Monday   3 
1111    Tuesday   3 
1111    Wednesday  3 
1111    Friday   4 
1111    Saturday   5 
1111    Sunday   6 
2222    Thursday   6 

我們可以用下面的命令得到value列最高值發生的歷史:tail(names(sort(table(data$value))), 1)

我動態需要得到僅含這個最高值出現在數據的子集。

所以輸出,我需要的是:

Num    Day    Value 
3333    Thursday   3 
1111    Monday   3 
1111    Tuesday   3 
1111    Wednesday  3 
+0

我會使用'data [data $ Value == as.numeric(names(which.max(table(data $ Value)))),]'。使用'tail'和'sort'是獲得最大數量的一種相當複雜的方式 - 我會在這裏使用'which.max'。而且,'names'返回一個字符向量。整數和字符之間的'=='比較似乎可行,但我認爲明確轉換爲'numeric'會更好。最後,我儘可能地避免使用'subset'(這裏的幾個帖子解釋了爲什麼'subset'可能會非常棘手)。 – cryo111

回答

4

您可以使用subset

indx <- tail(names(sort(table(df1$Value))),1) 
subset(df1, Value==indx) 

或者使用dplyr

library(dplyr) 
df1 %>% 
    group_by(Value) %>% 
    mutate(N=n()) %>% 
    ungroup() %>% 
    filter(N==max(N)) 

或者

library(data.table) 
    setDT(df1)[, N:=.N, Value][N==max(N)][, N:=NULL] 
+1

噢耶..我忘了這種方式..謝謝! :-) –

+0

除了風格之外,是否有使用'[,N:= NULL]'在'[,!'N',with = F]'的任何理由? – MichaelChirico

+0

@MichaelChirico我認爲兩者都可以使用,':='可能會更快一些(未測試) – akrun