【发布时间】:2019-10-31 08:22:15
【问题描述】:
我想用尽可能少的函数调用来重新编码一堆变量。我有一个 data.frame,我想在其中重新编码许多变量。我创建了一个包含所有变量名称的命名列表以及我想要执行的重新编码参数。在这里我使用map 和dpylr 没有问题。然而,当涉及到重新编码时,我发现使用car 包中的recode 比使用dpylr 自己的重新编码功能要容易得多。一个附带的问题是,是否有一种很好的方法可以用dplyr::recode 做同样的事情。
下一步,我将 data.frame 分解为嵌套的 tibble。在这里,我想在每个子集中进行特定的重新编码。这就是事情变得复杂的地方,我无法再在dpylr 管道中执行此操作了。我唯一得到的工作是一个非常丑陋的嵌套for loop。
寻找以一种简洁明了的方式完成此任务的想法。
让我们从简单的例子开始:
library(carData)
library(dplyr)
library(purrr)
library(tidyr)
# global recode list
recode_ls = list(
mar = "'not married' = 0;
'married' = 1",
wexp = "'no' = 0;
'yes' = 1"
)
recode_vars <- names(Rossi)[names(Rossi) %in% names(recode_ls)]
Rossi2 <- Rossi # lets save results under a different name
Rossi2[,recode_vars] <- recode_vars %>% map(~ car::recode(Rossi[[.x]],
recode_ls[.x],
as.factor = FALSE,
as.numeric = TRUE))
到目前为止,这对我来说似乎很干净,除了 car::recode 比 dplyr::recode 更容易使用之外。
我的实际问题来了。我要做的是在每个 tibble 子集中以不同的方式重新编码(在这个简单的示例中)变量 mar 和 wexp。在我的真实数据集中,我想在每个子集中重新编码的变量更多,而且名称也不同。有没有人知道如何使用dpylr 管道和map 做到这一点又好又干净?
nested_rossi <- as_tibble(Rossi) %>% nest(-race)
recode_wexp_ls = list(
no = list(
mar = "'not married' = 0;
'married' = 1",
wexp = "'no' = 0;
'yes' = 1"
),
yes = list(
mar = "'not married' = 1;
'married' = 2",
wexp = "'no' = 1;
'yes' = 2"
)
我们也可以将列表附加到嵌套的 data.frame 中,但我不确定这是否会提高效率。
nested_rossi$recode = list(
no = list(
mar = "'not married' = 0;
'married' = 1",
wexp = "'no' = 0;
'yes' = 1"
),
yes = list(
mar = "'not married' = 1;
'married' = 2",
wexp = "'no' = 1;
'yes' = 2"
)
)
【问题讨论】:
-
也许加入一个查找表,其中的列引用了您想要的子集、起始值和结束值?