2015-02-17 70 views
2

我有一個相當大的數據幀,其中有一個很多級別(超過4,000)的因子。我在同一個數據框中使用另一列作爲參考,並且我希望找到的是每當此引用列爲NA時的級別的子集。R - 僅顯示數據幀子集中使用的級別

我正在使用的第一步是subsetrows <- which(is.na(mydata$reference))但之後我卡住了。我想要類似levels(mydata[subsetrows,mydata$factor]),但不幸的是,該命令顯示我所有級別,而不僅僅是subsetrows中存在的級別。我想我可以創建一個新的向量我的數據框只有我的子集行,然後刪除任何未使用的水平,但有沒有更簡單/更乾淨的方式來做到這一點,可能沒有複製我的數據以外的數據框?如果我的數據框有從A到Z的因子水平,但在我的子集中只有P,R和Y出現,我想要返回水平P,R和Y的東西。

+0

也許這可能有助於http://stackoverflow.com/questions/1195826/dropping-factor-levels-in-a-subsetted-data-frame-in-r – NicE 2015-02-17 21:45:32

+2

你可以嘗試'水平(mydata $因子)[ MYDATA $因子subsetrows]'? – 2015-02-17 21:52:19

+2

那麼,使用你以前的'唯一'的想法,事實證明給了我正確的等級:'unique(as.character(mydata $ factor [subsetrows]))' – 2015-02-17 22:10:44

回答

0

我修改的建議,由薩芬的評論使用的功能unique似乎返回正確的水平。

解決方案:

subsetrows <- which(is.na(mydata$reference)) 
unique(as.character(mydata$factor[subsetrows])) 

雖然我喜歡學習新的軟件包和功能,這種解決方案似乎在這一點上,因爲它是更緊湊,更容易讓我明白,如果我需要在某個遙遠的點來重溫這段代碼更好在將來。

1

您當然可以通過base函數完成此操作。但我個人的偏好是使用dplyr與鏈接操作,如這樣的:

library(dplyr) 

d %>% 
    filter(is.na(ref)) %>% 
    select(field) %>% 
    distinct() 

數據

d <- data.frame(
    field = c("A", "B", "C", "A", "B", "C"), 
    ref = c(NA, "a", "b", NA, "c", NA) 
) 
+0

那個%>%操作符是做什麼的? – 2015-02-17 21:50:23

+0

這是來自[magrittr](https://github.com/smbache/magrittr)的前向管道運算符。基本上'x%>%f()'相當於'f(x)'。 – 2015-02-17 21:51:46

+0

所以......這相當於將'd $ ref'放入'filter'行,然後將結果放在'select'行中,然後將結果放在'distinct'行中? – 2015-02-17 21:57:51