编写计算列子集的行均值并创建列名的函数
Writing function that calculates rowwise mean for subset of columns and creates column name
我想把这行代码变成一个函数:
mutate(var_avg = rowMeans(select(., starts_with("var"))))
它在管道中工作:
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")
我有很多关于函数的知识要学习,我不确定从哪里开始解决这个问题。任何帮助将非常感激。请注意,这是一个简化的示例。在我的真实数据中,我有几个列前缀,我想计算每个列的行均值。编辑:能够一次运行多个前缀的功能将是一个奖励。
如果我们需要在分配的 lhs 上分配列名,请使用 :=
并评估 (!!
) 字符串。 mutate
内的 <-
将不起作用,因为默认选项是 =
,它会按字面意思计算 =
的 lhs 上未加引号的值。此外,我们可能需要将数据指定为函数中的参数
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_')))
我想把这行代码变成一个函数:
mutate(var_avg = rowMeans(select(., starts_with("var"))))
它在管道中工作:
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")
我有很多关于函数的知识要学习,我不确定从哪里开始解决这个问题。任何帮助将非常感激。请注意,这是一个简化的示例。在我的真实数据中,我有几个列前缀,我想计算每个列的行均值。编辑:能够一次运行多个前缀的功能将是一个奖励。
如果我们需要在分配的 lhs 上分配列名,请使用 :=
并评估 (!!
) 字符串。 mutate
内的 <-
将不起作用,因为默认选项是 =
,它会按字面意思计算 =
的 lhs 上未加引号的值。此外,我们可能需要将数据指定为函数中的参数
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_')))