我正在使用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,并在有其他值时返回总和。
任何想法怎么做?
答案 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视为数据帧。