用户定义函数,用于重命名R中指定列中的变量

31moq8wy  于 2023-01-28  发布在  其他
关注(0)|答案(4)|浏览(107)

我正在尝试编写一个函数,该函数将重命名R中数据表内多个列的变量。
我的数据表的结构类似于:
| 功能1|功能2|特辑3|功能4|
| - ------|- ------|- ------|- ------|
| 变量_a|变量_c|变量_b|变量_a|
| 变量_b|变量_a|变量_a|变量_c|
| 变量_c|变量_b|变量_c|变量_b|
我正在尝试将所有变量重命名为新名称。其中一些变量在feature1中用于一个项目,但在feature4中用于另一个项目,但命名在整个数据框中是相同的。
| 功能1|功能2|特辑3|功能4|
| - ------|- ------|- ------|- ------|
| 新的_a|新的_c|新_b|新的_a|
| 新_b|新的_a|新的_a|新的_c|
| 新的_c|新_b|新的_c|新_b|
我只是在编写自己的用户定义函数时遇到了麻烦,因为它比标准的dat$feature1\[dat$feature1 == 'var_a'\] \*\<- '\*new_a'代码行要少。
最好是,我想传递一些类似function(dat, var_a, new_a)的东西,或者我可以传递一个新旧变量的列表。
任何帮助都将不胜感激。谢谢!

6mw9ycah

6mw9ycah1#

以R为基数:

df[] <- lapply(df, function(x) gsub("var","new", x))

输出:

#   feature1 feature2 feature3 feature4
# 1    new_a    new_c    new_b    new_a
# 2    new_b    new_a    new_a    new_c
# 3    new_c    new_b    new_c    new_b

数据

df <- read.table(text = "feature1   feature2    feature3    feature4
var_a   var_c   var_b   var_a
var_b   var_a   var_a   var_c
var_c   var_b   var_c   var_b", header = TRUE)
df <- data.table::data.table(df)
ldfqzlk8

ldfqzlk82#

这是一个接受 Dataframe 、旧字符串及其替换的函数。

library(tidyverse)

replace_func <- function(df, var, new_var) {
  df %>%
    mutate(across(everything(), ~ .x %>%
                    str_replace_all(var, new_var)))
}

replace_func(df, "var", "new")

# A tibble: 3 × 4
  feature1 feature2 feature3 feature4
  <chr>    <chr>    <chr>    <chr>   
1 new_a    new_c    new_b    new_a   
2 new_b    new_a    new_a    new_c   
3 new_c    new_b    new_c    new_b
a64a0gku

a64a0gku3#

df[, lapply(.SD, sub, pattern = "var", replacement = "new", fixed = TRUE)]
#    feature1 feature2 feature3 feature4
# 1:    new_a    new_c    new_b    new_a
# 2:    new_b    new_a    new_a    new_c
# 3:    new_c    new_b    new_c    new_b

使用此示例数据:

library(data.table)
df = fread(text = 'feature1     feature2    feature3    feature4
var_a   var_c   var_b   var_a
var_b   var_a   var_a   var_c
var_c   var_b   var_c   var_b')
mlmc2os5

mlmc2os54#

使用dplyracross

library(dplyr)

df %>% 
  mutate(across(1:4, ~ sub(".*(_)", "new\\1", .x)))
  feature1 feature2 feature3 feature4
1    new_a    new_c    new_b    new_a
2    new_b    new_a    new_a    new_c
3    new_c    new_b    new_c    new_b

相关问题