2016-08-20 104 views
0

名義變量我有類似這樣的一個數據集:子集R中

x <- sample(c("A", "B", "C", "D"), 1000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05)) 
y <- sample(1:40, 1000, replace=TRUE) 
d <- data.frame(x,y) 

str(d) 
'data.frame': 1000 obs. of 2 variables: 
$ x: Factor w/4 levels "A","B","C","D": 1 3 3 2 3 3 3 3 4 3 ... 
$ y: int 28 35 14 4 34 36 30 35 26 9 ... 

table(d$x) 
A B C D 
115 204 637 44 

所以在我的真實數據集,我有數千個這些類別(A,B,C,d)。

我的真實數據集的str()

str(realdata) 
data.frame': 346340 obs. of 91 variables: 
$ author  : Factor w/ 42590 levels "-jon-","--LZR--",..: 1962 3434 1241 7666 6235 2391 1196 2779 1881 339 ... 
$ created_utc : Factor w/ 343708 levels "2015-05-01 02:00:41",..: 14815 23163 2281 3569 5922 7211 15783 5512 13485 8591 ... 
$ group : Factor w/ 5 levels "xyz","abc","bnm",..: 2 2 2 2 2 2 2 2 2 2 ... 
.... 

現在我想子集數據,所以我只有那些$作家(在d數據幀或$x)在我的新數據框中有更多的行總共超過100個條目。

我試過如下:

dnew <- subset(realdata, table(realdata$author) > 100) 

它給了我一個結果,但它似乎被納入作者的不是所有的條目。雖然它應該是更多,我只得到完整數據集的行的1.3%。我手工檢查(用Excel),它應該比這更多(約30%)。手動分析顯示,1.2%的$作者佔30%的參賽作品。所以看起來他只給了我一行有超過100個條目的$作者,但不是他所有的條目。

你知道一個方法來解決這個問題嗎?

回答

1

I.數據幀d與四個級別

table(d$x) 

    # A B C D 
    # 92 232 630 46 

II。檢查哪個級別有超過100條記錄

which(table(d$x)>100) 
    # B C 
    # 2 3 

三。子集d僅具有屬於具有大於100個記錄的級別的記錄的數據幀,即,level Blevel C

result <- d[ d$x %in% names(table(d$x))[table(d$x) > 100] , ] 
    dim(result) 
    # [1] 862 2 

    str(result) 
    # 'data.frame': 862 obs. of 2 variables: 
    # $ x: Factor w/ 4 levels "A","B","C","D": 3 2 3 3 2 2 2 3 3 3 ... 
    # $ y: int 29 32 27 40 30 38 8 16 2 23 ... 

水平AD0 records

table(result$x) 

    # A B C D 
    # 0 232 630 0 

IV仍然存在。使用0記錄刪除級別factor()

result$x <- factor(result$x) 

    str(result) 
    # 'data.frame': 860 obs. of 2 variables: 
    # $ x: Factor w/ 2 levels "B","C": 2 2 1 2 1 2 2 2 1 2 ... 
    # $ y: int 29 32 27 40 30 38 8 16 2 23 ... 

    table(result$x) 
    # B C 
    # 232 630 
+1

謝謝,這工作! –

+1

@akrun我不知道你已經添加了,對於我的答案,我使用了兩個鏈接的組合,我試了一下,然後發佈,這裏是http://stackoverflow.com/questions/24835233/subset-based-on-頻率級 http://stackoverflow.com/questions/1195826/drop-factor-levels-in-a-subsetted-data-frame 你的答案爲基地R也奏效我也檢查過,水平仍然堅持數據,所以我在第二個鏈接之後放棄了它們。 謝謝。 –

3

我們可以用data.table輕鬆做到這一點。轉換 'data.frame' 到 'data.table'(setDT(d),由 'x' 的分組,if觀測的數量是大於100,我們子集Data.table(.SD

library(data.table) 
ddt <- setDT(d)[, if(.N > 100) .SD, x] 

或者,如果我們使用dplyr,同樣的方法可以使用。

library(dplyr) 
dpl <- d %>% 
     group_by(x) %>% 
     filter(n() > 100) %>% 
     droplevels() 
str(dpl) 
#Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 866 obs. of 2 variables: 
#$ x: Factor w/ 2 levels "B","C": 1 1 2 1 1 2 2 2 2 2 ... 
# $ y: int 25 25 13 11 2 32 12 15 12 3 ... 

此外,在使用base R,在table可以b Ë有用

v1 <- table(d$x) 
d1 <- subset(d, x %in% names(v1)[v1 > 100]) 

由於列 'x' 爲factor,當我們subset數據集,該水平持續,由於OP沒有設置seed以消除使用droplevels

d2 <- droplevels(d1) 

,每個人的產出都不一樣。

str(d2) 
#'data.frame': 866 obs. of 2 variables: 
#$ x: Factor w/ 2 levels "B","C": 1 1 2 1 1 2 2 2 2 2 ... 
#$ y: int 25 25 13 11 2 32 12 15 12 3 ... 
+0

我試過用dplyr的版本。它適用於測試數據框。唉,我將它應用到我的真實數據集時收到錯誤消息:錯誤:無效的下標類型'整數'。我檢查,$作者是一個因素,因爲是x。我使用了以下命令auth < - realdata%>%group_by(realdata $ author)%>%filter(n()> 100) –

+0

@ 8bytez我還提供了另外兩個解決方案,一個使用'data.table',另一個使用'subset'。您接受的解決方案使用的是我首先發布的相同邏輯。這太瘋狂了。 – akrun

+0

@ 8bytez你甚至沒有在我的代碼中使用語法'group_by(realdata $ author)'我沒有被使用。 – akrun