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

在dplyr中使用管道时处理空数据帧(<;0行>;),r,if-statement,exception-handling,dataframe,dplyr,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)) 在我使用的过滤器返回一个空数据帧之前,一切都可

我正在使用
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))
在我使用的过滤器返回一个空数据帧之前,一切都可以正常工作,例如使用
filter(Category=='B')
返回

(或0长度行.名称)

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

DF %>%
filter(Category == 'B') %>%
select(Balance) %>% ifelse(nrow(.)==0, 0, sum(., na.rm=T))
另一种可能是使用
tryCatch
,但我不确定如何将其合并到管道中

总之,当数据帧为空时,我想返回0,当它有其他值时,我想返回总和

有什么办法吗?

试试这个:

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

我有一个备选答案,更符合你的问题

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

仅在链的第一部分使用dplyr函数,可以执行以下操作:

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

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

这比我预期的要容易,谢谢。您能解释一下这些额外的行的作用吗?
是从上一个管道传递的数据,
$Balance
选择列作为向量。试试:
DF$Balance
它给出一个数值向量。
tempDF = DF %>% 
  filter(Category == "B") %>% 
  select(matches("Balance")) %>% 
  summarize(s = sum(Balance)) 
tempDF = tempDF %>% as.numeric