首页 > 解决方案 > 正确子集列表以替换元素值

问题描述

上下文:
我有一个数据框列表,每个都包含不同的维度和列数据类型。我的最终目标是创建一个包含列名和数据类型的命名向量,我可以使用它来显式分配字段类型以将表写入数据库 - 中的field.types参数DBI::dbWriteTable()

方法:
我当前的方法是使用 提取列表中列的数据类型,对其进行class修改,以便我可以将其用作field.types参数中的命名向量。我需要评估数据是否是真正的整数值,并且我根据这个 SO post编写了一个函数来做到这一点。

目标:
我想使用我自己的函数的列表输出来识别和修改命名向量中真正整数值的数据类型。

问题:
我想用逻辑向量替换list_class基于另一个列表的列表中的元素。list_int我可以对单个数据框进行这种简单的替换/分配,但是在使用数据框列表时遇到了子集问题。我在下面包含了一个可重现的示例和一些尝试。

library(purrr)

list_df <- list(
  df1 = data.frame(v1 = seq(1,10,2),
                   v2 = seq(1,5,1),
                   v3 = seq(1,10,length.out = 5)),
  df2 = data.frame(v2 = c(seq(1,5), NA),
                   v3 = seq(2,7,1),
                   v4 = rep(pi,6)),
  df3 = data.frame(v3 = seq(1,2,length.out = 5),
                   v4 = sample(letters,5),
                   v5 = seq(1,10,2),
                   v6 = seq(1,5,1))
  )

list_class <- map(list_df, ~map_chr(., class)) #named vector

check_int <- function(v) { #check if truly integer value
  if (!is.numeric(v)) FALSE
  else all((v%%1 == 0)[!is.na(v%%1 == 0)])
}

list_int <- map(list_df, ~map_lgl(., ~check_int(.)))

对于下面的单个数据框

list_class[[1]][list_int[[1]]] <- "newdatatype"

而且我可以使用 base 从列表中提取我想要的子集Map

Map('[', list_class, list_int)

寻找有关如何将所有这些部分组合在一起的见解,或者我的方法是否完全关闭?

标签: rlist

解决方案


一个简单的循环应该可以工作,但如果你想要一个解决方案for,你也可以使用。map2purrr

循环:

for(i in seq_along(list_class))
  list_class[[i]][list_int[[i]]] <- "newdatatype"

呼噜声:

map2(list_class, list_int, ~{.x[.y] <- 'newdatatype'; .x})

输出:

# $df1
#            v1            v2            v3 
# "newdatatype" "newdatatype"     "numeric" 
# 
# $df2
#            v2            v3            v4 
# "newdatatype" "newdatatype"     "numeric" 
# 
# $df3
#            v3            v4            v5            v6 
#     "numeric"      "factor" "newdatatype" "newdatatype" 

推荐阅读