dplyr的summarize_all()与约()

时间:2017-07-31 06:43:34

标签: r dplyr

我正在尝试让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。

1 个答案:

答案 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排除在变量之外(即应该修复它)适用于ab 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