我正在尝试让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。
答案 0 :(得分:2)
使用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 tibble: 2 x 3 h a b * <dbl> <dbl> <dbl> 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 tibble: 2 x 2 a b <dbl> <dbl> 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 tibble: 2 x 3 height a b <dbl> <dbl> <dbl> 1 5 2 5 2 15 4 7