汇总数字列,返回非数字的最后一个值

时间:2018-08-23 04:50:33

标签: r dplyr

在对非数字列进行其他操作的同时,总结数据框或小标题的数字列并不罕见。

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条件中期望这一点。

1 个答案:

答案 0 :(得分:2)

ifelse似乎是问题所在,所以我创建了一个函数。我已经更新了答案。我已经在dates属性上对其进行了测试,它似乎也可以在列表中使用。我希望它能解决您的问题:

dt %>% group_by(category) %>%
  summarise_all(function(x){
  if(is.numeric(x)){
    return(mean(x))
  }else{
    nth(x,-1)
  }
}
)