该功能不适用于dplyr的选择包装器(包含,ends_with)

问题描述 投票:0回答:1

我正在尝试在数据集上计算行均值。我发现有人在这里创建了一个有用的功能(dplyr - using mutate() like rowmeans()),当我尝试每一列时都可以使用,但是当我尝试使用dplyr helper函数时却无法使用。

为什么这样做:

#The rowmeans function that works

my_rowmeans = function(..., na.rm=TRUE){
  x = 
    if (na.rm) lapply(list(...), function(x) replace(x, is.na(x), as(0, class(x)))) 
  else       list(...)

  d = Reduce(function(x,y) x+!is.na(y), list(...), init=0)

  Reduce(`+`, x)/d
}


#The data
library(tidyverse)
data <- tibble(id = c(1:4),
               turn_intent_1 = c(5, 1, 1, 4),
               turn_intent_2 = c(5, 1, 1, 3),
               turn_intent_3R = c(5, 5, 1, 3))

#The code that is cumbersome but works

data %>%
  mutate(turn_intent_agg = my_rowmeans(turn_intent_1, turn_intent_2, turn_intent_3R))

#The output

# A tibble: 4 x 5
     id turn_intent_1 turn_intent_2 turn_intent_3R turn_intent_agg
  <int>         <dbl>         <dbl>          <dbl>           <dbl>
1     1             5             5              5            5   
2     2             1             1              5            2.33
3     3             1             1              1            1   
4     4             4             3              3            3.33

但是这不起作用:

#The code
data %>%
  mutate(turn_intent_agg = select(., contains("turn")) %>% 
           my_rowmeans())

#The output
Error in class1Def@contains[[class2]] : no such index at level 1

当然,我可以键入每一列,但是此数据集有很多列。使用这些包装器会容易得多。

我需要输出看起来像包含所有列(例如id)的正确显示。

谢谢!

r dplyr mean contains mutate
1个回答
2
投票

我认为您可以将其简化为:

data %>%
 mutate(turn_intent_agg = rowMeans(select(., contains("turn"))))

     id turn_intent_1 turn_intent_2 turn_intent_3R turn_intent_agg
  <int>         <dbl>         <dbl>          <dbl>           <dbl>
1     1             5             5              5            5   
2     2             1             1              5            2.33
3     3             1             1              1            1   
4     4             4             3              3            3.33

而且您确实可以添加na.rm = TRUE参数:

data %>%
 mutate(turn_intent_agg = rowMeans(select(., contains("turn")), na.rm = TRUE))
© www.soinside.com 2019 - 2024. All rights reserved.