首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有约x()的dplyr的summarize_all()

带有约x()的dplyr的summarize_all()
EN

Stack Overflow用户
提问于 2017-07-31 06:43:33
回答 1查看 489关注 0票数 0

我正在尝试让dplyr的summarize_all()approx()一起工作。更具体地说,数据框架df将被内插到height_target:

代码语言:javascript
复制
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),这些命令的工作方式如下:

代码语言:javascript
复制
approx(x = df$height, y = df$a, xout = height_target)
# $x
# [1]  5 15
# 
# $y
# [1] 2 4

我能够用summarize()包装它,它产生了我想要的东西,但只为一列:

代码语言:javascript
复制
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

要将其应用于所有列,我将执行以下操作

代码语言:javascript
复制
summarize_all(df,
   funs(list(approx(x = height, y = ., xout = height_target)$y))
)

然而,这会导致错误。

Summarise_impl中的错误(.data,dots):评估错误:'x‘和'y’长度不同。

我猜想上述错误的'x''y'不是approx()的参数。.应该是一个列,因为下面的命令工作得很好。

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-31 07:15:38

当您使用summarise_all时,您指定的函数将应用于每个变量。在您的示例中,您也试图将该函数应用于变量height。要使它开始工作,首先要使用gather,即

代码语言:javascript
复制
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从变量中排除在外(即,对于ab vars,它应该是固定的)。

代码语言:javascript
复制
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,即

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45409032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档