我正在尝试让dplyr的summarize_all()与approx()一起工作。更具体地说,数据框架df将被内插到height_target:
library(tidyverse)
df <- tibble(height = c(0, 10, 20),
a = c(1, 3, 5),
b = c(4, 6, 8))
height_target <- c(5, 15)对于一个列(例如,列a),这些命令的工作方式如下:
approx(x = df$height, y = df$a, xout = height_target)
# $x
# [1] 5 15
#
# $y
# [1] 2 4我能够用summarize()包装它,它产生了我想要的东西,但只为一列:
summarize(df, h = list(height_target),
a = list(approx(x = height, y = a, xout = height_target)$y)) %>%
unnest()
# # A tibble: 2 x 2
# h a
# <dbl> <dbl>
# 1 5 2
# 2 15 4要将其应用于所有列,我将执行以下操作
summarize_all(df,
funs(list(approx(x = height, y = ., xout = height_target)$y))
)然而,这会导致错误。
Summarise_impl中的错误(.data,dots):评估错误:'x‘和'y’长度不同。
我猜想上述错误的'x'和'y'不是approx()的参数。.应该是一个列,因为下面的命令工作得很好。
summarize_all(df, funs(length(.)))
# # A tibble: 1 x 3
# height a b
# <int> <int> <int>
# 1 3 3 3
dfs <- summarize_all(df, funs(list(.)))
dfs$height
# [[1]]
# [1] 0 10 20
dfs$a
# [[1]]
# [1] 1 3 5
dfs$b
# [[1]]
# [1] 4 6 8知道summarize_all()的错误可能是什么吗?我用dplyr 0.72。
发布于 2017-07-31 07:15:38
当您使用summarise_all时,您指定的函数将应用于每个变量。在您的示例中,您也试图将该函数应用于变量height。要使它开始工作,首先要使用gather,即
library(tidyverse)
df %>%
gather(var, val, -height) %>%
group_by(var) %>%
summarise(h = list(height_target), a = list(approx(x = height, y = val, xout = height_target)$y)) %>%
unnest() %>%
spread(var, a)这给
A提布尔:2 x 3小时a b*1 5 2 5 2 15 4 7
如果您想使用summarise_*变体,那么您应该使用summarise_at而不是.*_all,因为您希望将height从变量中排除在外(即,对于a和b vars,它应该是固定的)。
df %>%
summarise_at(vars(-height), funs(list(approx(x = height, y = ., xout = height_target)$y))) %>%
unnest()这给了,
A提布尔:2 x 2 a b 1 2 5 2 4 7
正如您正确注释的那样,您可以使用summarise_all也包括height,即
df %>%
summarise_all(funs(list(approx(x = df$height, y = ., xout = height_target)$y))) %>%
unnest()给予,
A提布尔:2x3高度a b 1 5 2 5 2 15 4 7
https://stackoverflow.com/questions/45409032
复制相似问题