使用R和RStudio Server在Spark平台上工作,我想过滤我的tbl,其中给定的列(字符串)满足数字条件。因此,该列包含数字/整数值(' 1234')和字符串值(' x1234'),我想过滤掉后者。
这是否可以使用dyplr,例如使用过滤器运算符/函数?
我试过像:
ANONYMOUS
顺便说一句:数据存储在其他服务器上,我不想在本地加载数据。因此,我无法使用像数据帧这样的对象。我对像dyplr这样的图书馆有所了解。
非常感谢帮助!
答案 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$"))