我正在寻找一种通用解决方案,用于使用第二个类似数据帧的内容更新一个大数据帧。我有几十个数据集,每个都有数千行和超过 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
软件包似乎没有帮助,因为对我来说这是一个连接问题并不明显,至少通常不会超过这么多列。
此外,仅关注相交行的解决方案就足够了,因为我可以识别其他行并将它们绑定到其中。
下面是一些代码来制作上面的数据框:
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);
谢谢