在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