r-通过数据框中的数值过滤字母数字因子列

时间:2018-07-06 16:47:12

标签: r dataframe

我有一个非常混乱的数据框,其中包含带数字和字符的因子列。我需要过滤数值大于阈值的行。但是,这是一个问题,因为由于列中存在字符,所以我的列是无法转换为数字的因子。

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

3 个答案:

答案 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的最大值。