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

标签 r dataframe data.table

我正在寻找一种通用解决方案,用于使用第二个类似数据帧的内容更新一个大数据帧。我有几十个数据集,每个都有数千行和超过 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/

相关文章:

r - 将具有十六进制值的列转换为具有二进制值的多个列

r - 如何在ggplot中仅旋转注释中的文本?

r - 定位数据框中具有NA值的行的索引

r - 从多个虚拟变量到单个变量

r - 关于data.table 1.9.2的新特征J()

r - 分组后如何统计某个条件的数据

r - 西类牙语月份名称的数字

r - 在创建列表 tibble 列时在 "mutation"中使用 dplyr::sym() 会导致错误 is_symbol(x): object '.x' not found

r - 在 R 中使用向量、现有变量和 mapply 创建多个新变量

python - 保存带有一些额外信息的 DataFrame