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

标签 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)

请注意,由于日期列是非数字,因此它返回最后一行中的值而不是平均值:

# 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/

相关文章:

r - 使用 grepl 创建基于另一列的列

r - 如何从R中的命令行保存直方图

R:在堆栈栏上显示字符或类别

r - 使用 rowSum 在 dplyr 中使用正则表达式进行条件变异

R 计算满足所有可能列对条件的行

r - 汇总多个因子变量的水平

.net - 如何在 R 中的 RSQLite 中的两个连接之间共享 SQLite 内存数据库?

r - 如何从文档术语矩阵中删除 NaN 值

r - 使用 dplyr 获取 R 中 data.frame 列总和的更好方法

r - 将多个 NA 行添加到数据框