【发布时间】:2018-08-23 04:50:32
【问题描述】:
想要汇总数据框或 tibble 的数字列,同时对非数字列执行其他操作,这种情况并不少见。
这个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' must be type double 指的是有袋动物的列,导致尝试评估last。如果是这样,为什么它必须是双重的,还有其他方法吗?我不会从传统的 if/else 条件中期待这一点。
【问题讨论】:
-
summarise_if(is.numeric, mean) -
如果你想保持当前的结构,问题是因为
dplyr::if_else对类型很严格。ifelse或if ... else ...工作。不过,前者会删除日期属性,这很烦人,所以if (is.numeric(.)) mean(.) else last(.)可能是最好的。 -
@alistaire 使用
if (is.numeric(.)) mean(.) else last(.)我得到这个错误:Error in summarise_impl(.data, dots) : Column "date" must be length 1 (a summary value), not 7但也许我误解了如何使用它,是的ifelse删除了日期属性。