【问题标题】:R dplyr filter rows on numeric values for given columnR dplyr 根据给定列的数值过滤行
【发布时间】:2017-05-04 13:44:57
【问题描述】:

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

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

我试过这样的东西:

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

顺便说一句:数据存储在其他服务器上,我不想在本地加载数据。因此我不能使用像数据框这样的对象。我受限于像 dyplr 这样的库。

非常感谢您的帮助!

【问题讨论】:

    标签: r apache-spark dplyr


    【解决方案1】:

    我认为这不起作用:tbl2 &lt;- tbl %&gt;% filter(!is.numeric(col1))。在 tbl_df 或 df 中,每一列只有一个类。因此,在您的情况下,包含“123”和“x123”的 col1 应该属于“字符”类。

    一种可能的解决方案是将 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
    

    注意:有一条警告消息。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        这将为您提供数字行:

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

        这将为您提供非数字行:

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

        【讨论】:

          猜你喜欢
          • 2021-11-11
          • 2021-07-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-10
          • 1970-01-01
          • 2016-10-05
          • 1970-01-01
          相关资源
          最近更新 更多