r - 正确地对列表进行子集化以替换元素值

标签 r list

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

方法:
我当前的方法是使用 class 提取列表中列的数据类型,对其进行修改,以便我可以将其用作 field.types 中的命名向量> 论证。我需要评估数据是否是真正的整数值,我编写了一个基于 this SO post 的函数来执行此操作。 .

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

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

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"

我可以使用基本Map从列表中提取我想要的子集。

Map('[', list_class, list_int)

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

最佳答案

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

for 循环:

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" 

关于r - 正确地对列表进行子集化以替换元素值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52613175/

相关文章:

python - 如何再次将其转换为元组键值列表?

python - 需要找到有效的方法来找到强数

c - 使用 C 中的结构将文本读入链表

list - Prolog - 替换列表元素

javascript - R中的传单 sleep 选项

r - 向数据表添加边际?

r - 侧边栏菜单项之间的空间

R从原始数据生成二维直方图

r - 连接两个数据表以按日期范围覆盖值

python - 如何在列表中修改列表中的元素