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由变量(即它应该固定为ab变量),即

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 
+0

是,'height'将插值然而,它也应该工作:'approx(x = df $ height,y = df $ height,xout = height_target)'。这就是为什么我省略'summarize_all()'中的'list(height_target)'的原因。另外,我希望更好地理解'* _all'命令,所以我希望看到一个使用'summarize_all'的解决方案,或者理解为什么不可能。不管怎么说,还是要谢谢你! – sebschub

+0

@sebschub我编辑了我的答案。希望现在清楚 – Sotos

+0

感谢您的新建议。现在我明白我的命令在原则上是正确的,并且插入'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