2016-12-12 97 views
1

我有一些R中的数据,它包含缺少数据的特殊字符串。我想subset原始数据帧为有效数据和一个只有缺失数据检测因子级别是数字还是R中的字符串

在下面的示例中,我有一些数字值和缺少数据的两个字符串(MD1MD2)。

DF <- data.frame(x = c(1, 2, 3, "MD1", 5, "MD2")) 

如果只有几个这样的字符串,我可以列举出来,并提取子集(这不是我是如何做到的,但它是简单而符合这个问题的目的):

DF.invalid <- droplevels(subset(DF, x == "MD1" | x == "MD2")) 
DF.valid <- subset(DF, x != "MD1" & x != "MD2") 
DF.valid$x <- as.numeric(levels(DF.valid$x))[DF.valid$x] 

我的问题是,缺少的数据字符串可能不会提前知道。是否有适当的(优雅的)方法来检测MD1MD2是否为非数字并实现此结果,而不检查数据框并枚举非数字级别?

+1

做'as.numeric(levels(df $ x)[df $ x])',那些变成'NA'的是非数字的。 –

回答

1

x成为数据帧dat的因数列“具有混合数字和字符级别”(实际上所有级别都是字符)。

要提取 “级人物”,使用方法:

na.idx <- is.na(suppressWarnings(as.numeric(levels(x)))) 
non.num.levels <- levels(x)[na.idx] 

如果你想子集dat与水平,你可以使用

subset(dat, x %in% non.num.levels) 

但更好的方法是通过:

subset(dat, na.idx[x]) 
+0

在你看来,我应该在这里使用data.table,而不是data.frames? – philsf

相关问题