gpt4 book ai didi

r - 了解数据框列表的 lapply

转载 作者:行者123 更新时间:2023-12-04 10:54:45 28 4
gpt4 key购买 nike

我正在清理一组文本文件,目前将它们作为具有相同结构的数据框列表进行操作。

鉴于文本文件的结构,每个 df 中最终都会有一个不规则的单元格。该单元格包含一个包含列名和值的字符串。我需要提取该值并将其分配给一个新列,然后进行其他一些重新分配以获得所需的干净 dfs。最终,我知道我需要对数据本身做什么,但是我一直在想如何针对这个特定问题对 dfs 列表进行操作。

最小数据示例:

x = data.frame(V1 = c(1, 2, "Column name: 1.18"), V2 = c(1, 2, ""), V3 = c(1, 2, ""),
stringsAsFactors = FALSE)

V1 V2 V3
1 1 1 1
2 2 2 2
3 Column name: 1.18

list_x = list(x, x)

[[1]]
V1 V2 V3
1 1 1 1
2 2 2 2
3 Column name: 1.18

[[2]]
V1 V2 V3
1 1 1 1
2 2 2 2
3 Column name: 1.18

我一直主要使用 lapply 来清理 dfs,但仅用于添加/删除行/列和设置名称。这按我的预期工作。

我认为 lapply 适用于不规则单元格,但我不明白如何在 dfs 列表中获取数据。我在单个 df 上所做的工作不在列表中。我的误解是如何将 lapply 的输出分配给原始 dfs。我已经阅读了一些关于在 dfs 列表上操作的资源和 SO 问题,但还没有提出解决方案。

我的 lapply 功能:

list_x = lapply(list_x, function(x) gsub("Column name: ", "", x[3,1]))

[[1]]
[1] "1.18"

[[2]]
[1] "1.18"

我希望 lapply 的分配可以处理 dfs 中的数据,但是,它仅将每个列表分配给 gsub 的输出,从而摆脱了其余数据。

这是我的策略,因为这是我在解决单个 df 问题时想出正确数据结构的方式:

x2 = x
x2[3,1] = gsub("Column name: ", "", x2[3,1])
x2$V4 = 0
x2$V4[3] = as.numeric(x2$V1[3])
x2[3,1] = "3"
x2[x2==""] = 0

V1 V2 V3 V4
1 1 1 1 0.00
2 2 2 2 0.00
3 3 0 0 1.18

最佳答案

如果打算创建四列,则在循环遍历 list 之后与 lapply ,从第 1 列的第 3 行中提取数字部分,然后 cbind通过附加 0 与数据集的现有列。

lapply(list_x, function(x)  rbind(head(cbind(x, V4 = 0), -1), 
rep(c(3, 0, as.numeric(gsub("[^.0-9]+", "", x[3, 1]))), c(1, 2, 1)) ))
#[[1]]
# V1 V2 V3 V4
#1 1 1 1 0.00
#2 2 2 2 0.00
#3 3 0 0 1.18

#[[2]]
# V1 V2 V3 V4
#1 1 1 1 0.00
#2 2 2 2 0.00
#3 3 0 0 1.18

或者另一种选择是创建一个函数来应用 list数据帧数
f1 <- function(x) {i1 <- grep("Column name", x$V1)
v1 <- as.numeric(sub(".*\\s([0-9.]+)$", "\\1", x$V1[i1]))
x1 <- x[-i1,]
x1$V4 <- 0
rbind(x1, list(V1 = 3, V2 = 0, V3 = 0, V4 = v1))
}
lapply(list_x, f1)
#[[1]]
# V1 V2 V3 V4
#1 1 1 1 0.00
#2 2 2 2 0.00
#3 3 0 0 1.18

#[[2]]
# V1 V2 V3 V4
#1 1 1 1 0.00
#2 2 2 2 0.00
#3 3 0 0 1.18

关于r - 了解数据框列表的 lapply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57174247/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com