【问题标题】:Dealing with empty data frames (<0 rows>) when using pipes in dplyr在 dplyr 中使用管道时处理空数据帧(<0 行>)
【发布时间】:2016-04-15 10:41:46
【问题描述】:

我正在使用dplyr 过滤数据框

DF <- structure(list(Category = structure(c(1L, 1L, 1L), .Label = "A", class = "factor"), Balance = c(1000L, 3000L, 2500L)), .Names = c("Category", 
"Balance"), class = "data.frame", row.names = c(NA, -3L))

通过以下方式:

DF %>%
filter(Category == 'A') %>%
select(Balance) %>%
sum(., na.rm=T)   

一切正常,直到我使用的过滤器返回一个空数据框,例如使用filter(Category == 'B') 返回

&lt;0 rows&gt; (or 0-length row.names)

发生这种情况时,我想返回 0,但我的管道坏了。我尝试使用ifelse,但我的语法不正确:

DF %>%
filter(Category == 'B') %>%
select(Balance) %>% ifelse(nrow(.)==0, 0, sum(., na.rm=T))

另一种可能性是使用tryCatch,但我不确定如何将其合并到管道中。

总结一下,我想数据框为空的时候返回0,有其他值的时候求和。

有什么办法吗?

【问题讨论】:

    标签: r if-statement exception-handling dataframe dplyr


    【解决方案1】:

    试试这个:

    DF %>%
      filter(Category == 'B') %>%
      .$Balance %>%
      sum(na.rm = TRUE)   
    

    【讨论】:

    • 这比我预期的要容易,谢谢。你能解释一下这些额外的行是做什么的吗?
    • . 是您从前一个管道传递的数据,$Balance 选择列作为向量。试试:DF$Balance 它给出了一个数字向量。
    【解决方案2】:

    我有一个替代答案,这更符合您的问题。

    DF %>%
      filter(Category == 'B') %>%
      select(Balance) %>%
      unlist %>% # unlist so as to make vector
      sum(na.rm=T)
    

    【讨论】:

      【解决方案3】:

      在链的第一部分只使用 dplyr 函数,您可以做到:

      tempDF = DF %>% 
        filter(Category == "B") %>% 
        select(matches("Balance")) %>% 
        summarize(s = sum(Balance)) 
      tempDF = tempDF %>% as.numeric
      

      我发现这很有用,因为它仅在最后一步将空数据框转换为向量。这让我有机会将 tempDF 视为数据框,然后再转换为 0。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-28
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        • 2021-12-16
        • 1970-01-01
        相关资源
        最近更新 更多