将相同的重新编码规则应用于多个数据框

Apply same recoding rules to multiple data frames

提问人:sdS 提问时间:1/19/2023 最后编辑:zephrylsdS 更新时间:1/19/2023 访问量:83

问:

我有 5 个数据帧。我想对每个数据帧使用相同的规则重新编码所有以“_comfort”、“_agree”和“effective”结尾的变量。按原样,每列中的值是 1:5,我想将 5 重新编码为 1,将 4 重新编码为 2,将 2 重新编码为 4,将 5 重新编码为 1(3 将保持不变)。
我不希望最终结果到一个合并的数据集,而是在所有 5 个独立的数据帧中应用相同的重新编码规则。为简单起见,我们假设我有 2 个数据帧:

df1 <- data.frame(a_comfort = c(1, 2, 3, 4, 5),
        b_comfort = c(1, 2, 3, 4, 5),
        c_effective = c(1, 2, 3, 4, 5))

df2 <- data.frame(a_comfort = c(1, 2, 3, 4, 5),
        b_comfort = c(1, 2, 3, 4, 5),
        c_effective = c(1, 2, 3, 4, 5))

我想要的是:

df1 <- data.frame(a_comfort = c(5, 4, 3, 2, 1),
        b_comfort = c(5, 4, 3, 2, 1),
        c_effective = c(5, 4, 3, 2, 1))

df2 <- data.frame(a_comfort = c(5, 4, 3, 2, 1),
        b_comfort = c(5, 4, 3, 2, 1),
        c_effective = c(5, 4, 3, 2, 1))

传统上,我会使用 's and 来实现我的目标,但这种方法在多个数据帧中都没有成功。我认为 purr 和 dplyr 包的组合会起作用,但还没有确定确切的技术。dplyrmutate_atends_with

提前感谢您的任何帮助!

R DPLYR的

评论


答:

3赞 zephryl 1/19/2023 #1

您可以在循环中使用 和:get()assign()

library(dplyr)

for (df_name in c("df1", "df2")) {
  df <- mutate(
    get(df_name),
    across(
      ends_with(c("_comfort", "_agree", "_effective")),
      \(x) 6 - x
    )
  )
  assign(df_name, df)
}

结果:

#> df1
  a_comfort b_comfort c_effective
1         5         5           5
2         4         4           4
3         3         3           3
4         2         2           2
5         1         1           1

#> df2
  a_comfort b_comfort c_effective
1         5         5           5
2         4         4           4
3         3         3           3
4         2         2           2
5         1         1           1

但请注意,将多个相关数据帧保留在一个列表中通常比在全局环境中松散更好(请参阅)。在这种情况下,您可以使用(或):purrr::map()base::lapply()

library(dplyr)
library(purrr)

dfs <- list(df1, df2)

dfs <- map(
  dfs,
  \(df) mutate(
    df,
    across(
      ends_with(c("_comfort", "_agree", "_effective")),
      \(x) 6 - x
    )
  )
)

结果:

#> dfs
[[1]]
  a_comfort b_comfort c_effective
1         5         5           5
2         4         4           4
3         3         3           3
4         2         2           2
5         1         1           1

[[2]]
  a_comfort b_comfort c_effective
1         5         5           5
2         4         4           4
3         3         3           3
4         2         2           2
5         1         1           1
0赞 jkatam 1/19/2023 #2

请尝试以下代码,我将列转换为因子,然后重新编码它们

数据

  a_comfort b_comfort c_effective
1         1         1           1
2         2         2           2
3         3         3           3
4         4         4           4
5         5         5           5

法典

library(tidyverse)

df1 %>% mutate(across(c(ends_with('comfort'),ends_with('effective')), ~ factor(.x, levels=c('1','2','3','4','5'), labels=c('5','4','3','2','1'))))

输出

  a_comfort b_comfort c_effective
1         5         5           5
2         4         4           4
3         3         3           3
4         2         2           2
5         1         1           1

2赞 Darren Tsai 1/19/2023 #3

您可以使用它来查找名称与特定模式匹配的所有对象。然后将它们存储到 a 中,并传递给 or 进行重新编码。ls(pattern = 'df\\d+')listpurrr::maplapply

library(dplyr)

df.lst <- purrr::map(
  mget(ls(pattern = 'df\\d+')),
  ~ .x %>% mutate(6 - across(ends_with(c("_comfort", "_agree", "effective"))))
)

# $df1
#   a_comfort b_comfort c_effective
# 1         5         5           5
# 2         4         4           4
# 3         3         3           3
# 4         2         2           2
# 5         1         1           1
# 
# $df2
#   a_comfort b_comfort c_effective
# 1         5         5           5
# 2         4         4           4
# 3         3         3           3
# 4         2         2           2
# 5         1         1           1

您可以从列表中进一步覆盖工作区中的这些数据帧。list2env()

list2env(df.lst, .GlobalEnv)