想要汇总数据框或小标题的数字列,同时对非数字列执行其他操作的情况并不罕见。
有一个很好的技巧 here ,但对于字符列似乎失败。
首先,它在这里工作,返回数字列的平均值和其他列的第一行的值
set.seed(1234)
category <- (c('A','A','E','E','B','B','C'))
date <- seq(as.Date("2017-01-01"), by = "month", length.out = 7)
value1 <- sample(seq(from = 91, to = 97, by = 1))
dt <- data.frame(category, date, value1)
dt<- as_tibble(dt)
#works
dt2<- dt %>%
group_by(category) %>%
summarise_all(funs(if_else(is.numeric(.), mean(.), last(.))))
print(dt2)
请注意,由于日期列是非数字,因此它返回最后一行中的值而不是平均值:
# A tibble: 4 x 3
category date value1
<fct> <date> <dbl>
1 A 2017-02-01 92.5
2 B 2017-06-01 93.5
3 C 2017-07-01 97
4 E 2017-04-01 94.5
但是,当其中一列是 chr 时,它会失败
marsupial <-c("quoll","phascogale",'triok','opossum','antechinus','bandicoot','Fat-tailed dunnart')
dt$marsupial <- marsupial
dt3<- dt %>% #doesn't work
group_by(category) %>%
summarise_all(funs(if_else(is.numeric(.), mean(.), last(.))))
print(dt3)
出现这些错误:
Error in summarise_impl(.data, dots) :
Evaluation error: `false` must be type double, not character.
In addition: Warning message:
In mean.default(marsupial) :
argument is not numeric or logical: returning NA
我假设'false'必须是double类型
指的是有袋动物列,导致尝试评估last
。如果是这样,为什么必须是双倍的,还有其他方法吗?我不希望传统的 if/else 条件出现这种情况。
最佳答案
ifelse 似乎是问题所在,所以我创建了一个函数。我已经更新了我的答案。我已经在日期属性上测试了它,它似乎也适用于列表。我希望它能解决您的问题:
dt %>% group_by(category) %>%
summarise_all(function(x){
if(is.numeric(x)){
return(mean(x))
}else{
nth(x,-1)
}
}
)
关于r - 汇总数字列,返回非数字的最后一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51978519/