提问人:sdS 提问时间:1/19/2023 最后编辑:zephrylsdS 更新时间:1/19/2023 访问量:83
将相同的重新编码规则应用于多个数据框
Apply same recoding rules to multiple data frames
问:
我有 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 包的组合会起作用,但还没有确定确切的技术。dplyr
mutate_at
ends_with
提前感谢您的任何帮助!
答:
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+')
list
purrr::map
lapply
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)
评论