我有一个非常混乱的数据框,其中包含带数字和字符的因子列。我需要过滤数值大于阈值的行。但是,这是一个问题,因为由于列中存在字符,所以我的列是无法转换为数字的因子。
DF <- data.frame(
Col1 = c("Egg", "", "3"),
Col2 = c("", "Flour", ""),
Col3 = c("2", "", "Bread"),
Col4 = c("4", "", ""),
Col5 = c("", "6", "8")
)
结果数据框如下:
> DF
Col1 Col2 Col3 Col4 Col5
1 Egg 2 4
2 Flour 6
3 3 Bread 8
每列都是一个因素:
> class(DF$Col1)
[1] "factor"
>
在此示例中,如何在至少一列中过滤数值大于等于5的行?在此示例中,所需的输出如下所示:
> DF
Col1 Col2 Col3 Col4 Col5
2 Flour 6
3 3 Bread 8
答案 0 :(得分:3)
您会从make()
得到一些警告,但这也可以起作用:
+------------------------------+
| Tables_in_test |
+------------------------------+
| batch_job_execution |
| batch_job_execution_context |
| batch_job_execution_params |
| batch_job_execution_seq |
| batch_job_instance |
| batch_job_seq |
| batch_step_execution |
| batch_step_execution_context |
| batch_step_execution_seq |
按照@Frank的建议(比上面的建议要干净一些):
dplyr
答案 1 :(得分:3)
使用numeric
只能从每个观察值中选择gsub
个值,并将其转换为数字。之后,在具有subset
的base-R apply
中可以提供以下解决方案:
subset(DF, apply(DF, 1, function(x){
#Get only numeric values and convert to numeric
val <- as.numeric(gsub("[^[:digit:]]", "",x))
any(val[!is.na(val)] > 5)
})
)
# Col1 Col2 Col3 Col4 Col5
# 2 Flour 6
# 3 3 Bread 8
答案 2 :(得分:0)
做到这一点的一种方法是:
DF[do.call(function(...) pmax(..., na.rm=TRUE), data.frame(lapply(lapply(DF, as.character), as.numeric), stringsAsFactors = FALSE)) > 5,]
为说明其作用,lapply(DF, as.character)
除去了这些因素,然后lapply(lapply(DF, as.character), as.numeric)
将字符转换为数字(文本变为NA),然后data.frame(lapply(lapply(DF, as.character), as.numeric), stringsAsFactors = FALSE)
将其改回到数据框,例如
> data.frame(lapply(lapply(DF, as.character), as.numeric), stringsAsFactors = FALSE)
Col1 Col2 Col3 Col4 Col5
1 NA NA 2 4 NA
2 NA NA NA NA 6
3 3 NA NA NA 8
使用pmax的do.call查找行的最大值(感谢rowwise maximum for R),然后我们可以轻松地过滤出大于5的最大值。