在对非数字列进行其他操作的同时,总结数据框或小标题的数字列并不罕见。
此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)
请注意,因为date列是非数字的,所以它返回最后一行的值,而不是平均值:
# 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' must be type double
是指有袋动物栏,导致尝试评估last
。如果是这样,为什么必须将它加倍,还有另一种方法吗?我不会从常规的if / else条件中期望这一点。
答案 0 :(得分:2)
ifelse似乎是问题所在,所以我创建了一个函数。我已经更新了答案。我已经在dates属性上对其进行了测试,它似乎也可以在列表中使用。我希望它能解决您的问题:
dt %>% group_by(category) %>%
summarise_all(function(x){
if(is.numeric(x)){
return(mean(x))
}else{
nth(x,-1)
}
}
)