gpt4 book ai didi

r - 使用相似数据帧的内容来提高更新大数据帧内容的性能

转载 作者:行者123 更新时间:2023-12-04 11:23:53 26 4
gpt4 key购买 nike

我正在寻找一种通用解决方案,用于使用第二个类似数据帧的内容更新一个大数据帧。我有几十个数据集,每个都有数千行和超过 10,000 列。 “更新”数据集将与其相应的“基础”数据集重叠,按行排列从百分之几到大约 50%。数据集有一个“键”列,在任何给定的数据集中,每个唯一键值只有一行。

基本规则是:如果给定单元格的更新数据集中存在非 NA 值,则用该值替换基础数据集中的相同单元格。 (“相同单元格”表示“键”列和列名的相同值。)

请注意,更新数据集可能包含我可以使用 rbind 处理的新行(“插入”)。

因此,给定基本数据框“df1”,其中“K”列是唯一键列,“P1”..“P3”代表 10,000 列,其名称从一对数据集到下一个数据集会有所不同:

  K P1 P2 P3
1 A 1 1 1
2 B 1 1 1
3 C 1 1 1

...和更新数据框“df2”:
  K P1 P2 P3
1 B 2 NA 2
2 C NA 2 2
3 D 2 2 2

我需要的结果如下,其中“B”和“C”的 1 被 2 覆盖,但未被 NA 覆盖:
  K P1 P2 P3
1 A 1 1 1
2 B 2 1 2
3 C 1 2 2
4 D 2 2 2

这似乎不是一个合并候选者,因为合并给了我重复的行(相对于“键”列)或重复的列(例如 P1.x、P1.y),我必须对其进行迭代才能以某种方式折叠.

我已经尝试使用最终行/列的维度预先分配一个矩阵,并用 df1 的内容填充它,然后迭代 df2 的重叠行,但我无法获得优于每秒 20 个单元格的性能,需要数小时完成(与 SAS 中等效的 DATA 步 UPDATE 功能的分钟相比)。

我确定我遗漏了一些东西,但找不到可比较的例子。

我看到 ddply 用法看起来很接近,但不是通用解决方案。 data.table package 似乎没有帮助,因为对我来说这是一个连接问题并不明显,至少通常不会超过这么多列。

此外,仅关注相交行的解决方案就足够了,因为我可以识别其他行并将它们绑定(bind)到其中。

下面是一些代码来制作上面的数据框:

cat("K,P1,P2,P3", "A,1,1,1", "B,1,1,1", "C,1,1,1", file="f1.dat", sep="\n");
cat("K,P1,P2,P3", "B,2,,2", "C,,2,2", "D,2,2,2", file="f2.dat", sep="\n");
df1 <- read.table("f1.dat", sep=",", header=TRUE, stringsAsFactors=FALSE);
df2 <- read.table("f2.dat", sep=",", header=TRUE, stringsAsFactors=FALSE);

谢谢

最佳答案

这按列循环,设置 dt1通过引用和(希望)应该很快。

dt1 = as.data.table(df1)
dt2 = as.data.table(df2)
if (!identical(names(dt1),names(dt2)))
stop("Assumed for now. Can relax later if needed.")
w = chmatch(dt2$K, dt1$K)
for (i in 2:ncol(dt2)) {
nna = !is.na(dt2[[i]])
set(dt1,w[nna],i,dt2[[i]][nna])
}
dt1 = rbind(dt1,dt2[is.na(w)])
dt1
K P1 P2 P3
[1,] A 1 1 1
[2,] B 2 1 2
[3,] C 1 2 2
[4,] D 2 2 2

关于r - 使用相似数据帧的内容来提高更新大数据帧内容的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10015544/

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