R dplyr对给定列的数值进行过滤

时间:2016-12-19 13:31:30

标签: r apache-spark dplyr

使用R和RStudio Server在Spark平台上工作,我想过滤我的tbl,其中给定的列(字符串)满足数字条件。因此,该列包含数字/整数值(' 1234')和字符串值(' x1234'),我想过滤掉后者。

这是否可以使用dyplr,例如使用过滤器运算符/函数?

我试过像:

ANONYMOUS

顺便说一句:数据存储在其他服务器上,我不想在本地加载数据。因此,我无法使用像数据帧这样的对象。我对像dyplr这样的图书馆有所了解。

非常感谢帮助!

3 个答案:

答案 0 :(得分:4)

我认为这不起作用:tbl2 <- tbl %>% filter(!is.numeric(col1))。在tbl_df或df中,每列只有一个类。所以在你的情况下,col1包含&#34; 123&#34;和&#34; x123&#34;应该属于&#34;字符&#34;。

一种可能的解决方案是将col1转换为数字,并测试转换是否成功。

tbl2 <- tbl %>% filter(!is.na(as.numeric(col1)))

测试:

library(data.frame)
df <- data.frame(a=1:3,b=2:4)
df[2,2] <- "x123"
class(df$b)
# "character"
df %>% filter(!is.na(as.numeric(b)))
#  a b
#1 1 2
#2 3 4

注意:有一条警告信息。

答案 1 :(得分:2)

可能有两种方法:您可以使用正则表达式来识别可转换为数字的字符串,例如grepl("^[0-9]$", c("1", "1.x", "x.1", "5.5"), perl = T)(请参阅Regex for numbers only)。

另一种方法是强制将字符串转换为as.numeric中的数字并过滤掉NA,例如filter(!is.na(as.numeric(c("1", "1.x", "x.1", "5.5"))))

编辑 ups,只是一分钟太晚了; - )

答案 2 :(得分:0)

这只会让你得到数字行:

tbl2 <- tbl %>% filter(!str_detect(col1,"^\s*[0-9]\s$"))

这只会让你得到非数字行: tbl2 <- tbl %>% 过滤器(str_detect(col1,"^\s*[0-9]\s$"))