在dplyr中使用管道时处理空数据帧(< 0行>)

时间:2016-04-15 10:41:46

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

我正在使用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')返回

<0 rows> (or 0-length row.names)

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

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

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

总而言之,我希望在数据框为空时返回0,并在有其他值时返回总和。

任何想法怎么做?

3 个答案:

答案 0 :(得分:1)

Try this:

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

答案 1 :(得分:1)

我有一个替代答案,更多的是你的问题。

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

答案 2 :(得分:1)

在链的第一部分只使用dplyr函数,你可以这样做:

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

我发现这很有用,因为它只在最后一步将空数据帧转换为矢量。这使我有机会在转换为0之前将tempDF视为数据帧。