r - 正确子集列表以替换元素值
问题描述
上下文:
我有一个数据框列表,每个都包含不同的维度和列数据类型。我的最终目标是创建一个包含列名和数据类型的命名向量,我可以使用它来显式分配字段类型以将表写入数据库 - 中的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)
寻找有关如何将所有这些部分组合在一起的见解,或者我的方法是否完全关闭?
解决方案
一个简单的循环应该可以工作,但如果你想要一个解决方案for
,你也可以使用。map2
purrr
循环:
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"
推荐阅读
- flutter - 视频播放器颤振的基本界面
- php - Laravel如何检查和避免控制器中的重复条目
- java - 如何单击 ::before 和 ::after 内的元素
- python - 如何有效地从另一个数组中删除一个数组的元素
- apache - 针对 Apache 和 Liferay 重定向问题的 Docker Compose
- mysql - MySQL 上的 Flask SQLAlchemy pool_pre_ping 根本不工作
- python - 获取从数组到变量的所有内容
- reactjs - 检查路由是否有效反应路由器
- c# - c# 中的高级元编程是否有一些行业“标准”?
- jenkins - Jenkins 在失败时打印敏感变量