2015-02-17 45 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