dplyr的summarize_all()与约()
问题描述:
我试图让dplyr的summarize_all()
与approx()
一起使用。更具体的,该数据帧df
要被内插以height_target:dplyr的summarize_all()与约()
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))
)
然而,这给出了错误
Error in summarise_impl(.data, dots) : Evaluation error: 'x' and 'y' lengths differ.
我猜想,上述'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。
答
当您使用summarise_all
时,您指定的函数适用于每个变量。在你的情况下,你也试图将该函数应用于变量height
。为了得到它的工作我,D使用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)
如果你想使用summarise_*
变体,它给人
# A tibble: 2 x 3 h a b * <dbl> <dbl> <dbl> 1 5 2 5 2 15 4 7
,那么你应该使用summarise_at
不.*_all
,因为要排除height
由变量(即它应该固定为a
和b
变量),即
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
是,'height'将插值然而,它也应该工作:'approx(x = df $ height,y = df $ height,xout = height_target)'。这就是为什么我省略'summarize_all()'中的'list(height_target)'的原因。另外,我希望更好地理解'* _all'命令,所以我希望看到一个使用'summarize_all'的解决方案,或者理解为什么不可能。不管怎么说,还是要谢谢你! – sebschub
@sebschub我编辑了我的答案。希望现在清楚 – Sotos
感谢您的新建议。现在我明白我的命令在原则上是正确的,并且插入'height' _is fine_。实际上,这太好了,因为插入'height'会在同名的结果中产生一个新列。当'summarize_all'想要在下一列'a'上工作时,它将按照预期使用新创建的'height'列而不是原始列。因此,简单地引用df就会产生正确的结果:'summarize_all(df,funs(list(approx(x = df $ height,y =。,xout = height_target)$ y)))%>%unnest()'。你可以将其纳入你的答案或我应该这样做吗? – sebschub