如何将列表中的多个向量迭代存储到数据帧列表中的适当列中?

How can I iteratively store several vectors from a list into appropriate columns in a list of dataframes?

我生成了 30 个估算数据帧,它们存储在列表 list.of.imputed.dfs 中,该列表属于 类 "mild" "list"。数据框中的某些值需要根据早期值进行更改以创建生存结果。例如,如果 var1 的观测值为 1,则所有后续值(例如 var2)均为 1,否则观测值将保持其原始值。为此,我使用了以下代码:

a <- lapply(list.of.imputed.dfs), function(x1) {ifelse((x1$var1 == 1), 1, x1$var2}).

a 现在是一个包含 30 个向量的列表(每个向量对应一个估算的数据帧),其中包含 var2 的更新值。现在,我想将这些值存储回 list.of.imputed.dfs 中每个数据框的相应列。为此,我目前正在使用以下代码并且它有效:

list.of.imputed.dfs$`1`$var2 <- a$`1`
list.of.imputed.dfs$`2`$var2 <- a$`2`
...
list.of.imputed.dfs$`30`$var2 <- a$`30`

其中,例如,左侧的 1 是估算的数据框,右侧的 1 是新创建列表中的向量。 ... 意味着每个估算的数据帧和新创建的列表中的每个向量还有 28 行 a

我实际上必须将结果更改为总共三个位置 (var2, var3, and var4) 的生存结果,这意味着至少需要 90 行代码才能将这些值存储回适当的列适当的估算数据框。我想知道的是如何迭代我创建的列表 (a) 以迭代地将值存储回估算的数据帧。或者在尝试将更新值存储回 list.of.imputed.dfs 的适当数据帧的适当列之前,我什至需要将更新值存储在 a 中吗?感谢您提供的任何帮助!

基于 Samuel Calderon 的建议的可重现示例。

# Simulating data
set.seed(500)
N <- 100
data <- data.frame(id = 1:N,
                   tx = rbinom(100, 1, .75),
                   var1 = rbinom(100, 1, .20),
                   var2 = rbinom(100, 1, .30),
                   var3 = rbinom(100, 1, .40),
                   var4 = rbinom(100, 1, .50))
                   
                   
c_names <- c("tx", "var1", "var2", "var3", "var4")
prc_missing <- 0.20

# Simulating missingness in the data
data <- data %>%
  gather(var, value, -id) %>%
  mutate(r = runif(nrow(.)),
         value = ifelse(var %in% c_names & r <= prc_missing, NA, value)) %>% select(-r) %>% spread(var, value)

# Imputing data to account for assumed MAR
imputed.data <- mice(data, m = 30, maxit = 50, method = "pmm", seed = 500)
list.of.imputed.dfs <- complete(imputed.data, "all")

# Trying to apply new values over original values
modify_vars <- function(x) {
  x$var2 <- ifelse(x$var1 == 1, 1, x$var2)
  x$var3 <- ifelse(x$var2 == 1, 1, x$var3)
  x$var4 <- ifelse(x$var3 == 1, 1, x$var4)
  x
}
lapply(list.of.imputed.dfs, modify_vars)

您可以创建一个函数来单独修改数据框,然后应用于列表中的所有元素。

modify_vars <- function(x) {
    x$var2 <-  ifelse(x$var1 == 1, 1, x$var2)
    x$var3 <-  ifelse(x$var1 == 1, 1, x$var3)
    x$var4 <-  ifelse(x$var1 == 1, 1, x$var4)
    x
}

lapply(list_of_dfs, modify_vars)