繁体   English   中英

编写 function 计算列子集的行均值并创建列名

[英]Writing function that calculates rowwise mean for subset of columns and creates column name

我想把这行代码变成function:

mutate(var_avg = rowMeans(select(., starts_with("var"))))

它适用于 pipe:

df <- read_csv("var_one,var_two,var_three
1,1,1
2,2,2
3,3,3")

df %>% mutate(var_avg = rowMeans(select(., starts_with("var"))))

># A tibble: 3 x 4
>  var_one var_two var_three var_avg
>    <dbl>   <dbl>     <dbl>   <dbl>
>1       1       1         1       1
>2       2       2         2       2
>3       3       3         3       3

这是我的尝试(我是编写函数的新手):

colnameMeans <- function(x) {
  columnname <- paste0("avg_",x)
  mutate(columnname <- rowMeans(select(., starts_with(x))))
}

它不起作用。

df %>% colnameMeans("var")
>Error in colnameMeans(., "var") : unused argument ("var")

我有很多要学习的功能,我不知道从哪里开始解决这个问题。 任何帮助将非常感激。 请注意,这是一个简化的示例。 在我的真实数据中,我有几个列前缀,我想计算每个列的逐行平均值。 编辑:能够同时为多个前缀运行 function 将是一个奖励。

如果我们需要在赋值的 lhs 上指定列名,请使用:=并评估 ( !! ) 字符串。 <-内部的mutate将不起作用,因为默认选项是= ,它会在=的 lhs 上逐字评估未引用的值。 此外,我们可能需要在 function 中指定数据作为参数

library(dplyr)
colnameMeans <- function(., x) { 
   columnname<- paste0("avg_", x)
   mutate(., !! columnname := rowMeans(select(., starts_with(x))))
  }
df %>% 
  colnameMeans('var')
# A tibble: 3 x 4
#  var_one var_two var_three avg_var
#    <dbl>   <dbl>     <dbl>   <dbl>
#1       1       1         1       1
#2       2       2         2       2
#3       3       3         3       3

如果有多个前缀,请使用map

library(purrr)
library(stringr)
colnameMeans <- function(., x) { 
   columnname<- paste0("avg_", x)
   transmute(., !! columnname := rowMeans(select(., starts_with(x))))
  }


map_dfc(c('var', 'alt'), ~ df1 %>%
        colnameMeans(.x)) %>%
      bind_cols(df1, .)
# A tibble: 3 x 8
#  var_one var_two var_three alt_var_one alt_var_two alt_var_three avg_var avg_alt
#*   <dbl>   <dbl>     <dbl>       <dbl>       <dbl>         <dbl>   <dbl>   <dbl>
#1       1       1         1           1           1             1       1       1
#2       2       2         2           2           2             2       2       2
#3       3       3         3           3           3             3       3       3

数据

df1 <- bind_cols(df,  df %>% rename_all(~ str_replace(., 'var_', 'new_')))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM