用另一个数据帧填充一个数据帧中的值

问题描述 投票:0回答:1

我在 Databricks 的 R 环境中必须执行的某些处理时遇到一些问题。我有两个数据框。

df1:包含行和列(index1和index2)以及要分配的值

索引1 索引2 价值
142342315 1423423341 A
142342315 14234235325 A
1423423166 14234235325 C
1423423166 1423423341 C
... ... ...

df2:由具有所有索引组合的数组生成

行名称 142342315 1423423166 1423423341 14234235325
142342315 不适用 不适用 不适用 不适用
1423423166 不适用 不适用 不适用 不适用
1423423341 不适用 不适用 不适用 不适用
14234235325 不适用 不适用 不适用 不适用

首先想到的是创建一个循环将值分配给数据帧中的每个位置。类似这样的东西:

for (i in 1:nrow(df1)) {
    df2[df1$index_1[i], df1$index_2[i]] <- df1$temp[i]
    df2[df1$index_2[i], df1$index_1[i]] <- df1$temp[i]
}

但是,问题是它涉及大量的组合,需要几个小时的执行时间。

我尝试使用稀疏矩阵,但在这种情况下我的索引无法转换为整数。你能想出一种最佳的方法吗?

我尝试了for循环,它太慢了。 我尝试使用稀疏矩阵,但在这种情况下我的索引无法转换为整数。

r sparkr
1个回答
0
投票

如果我理解正确的话,您正在寻找一个包含两个维度上所有名称的方阵。我认为如果您预先分配输出矩阵并用某些矢量化版本替换 for 循环,您最初的方法应该可行。下面的怎么样?

df1 = data.frame(
    index1=c("142342315", "142342315", "1423423166", "1423423166"),
    index2=c("1423423341", "14234235325", "14234235325", "1423423341"),
    value=c("A","A","C","C")
)

rowsname = unique(c(df1$index1,df1$index2))
res = matrix(nrow=length(rowsname),ncol=length(rowsname),dimnames=list(rowsname,rowsname))

lapply(1:nrow(df1), function(r) {
    res[df1$index1[r], df1$index2[r]] <<- df1$value[r]
    res[df1$index2[r], df1$index1[r]] <<- df1$value[r]
})

变量“res”的内容:

            142342315 1423423166 1423423341 14234235325
142342315   NA        NA         "A"        "A"        
1423423166  NA        NA         "C"        "C"        
1423423341  "A"       "C"        NA         NA         
14234235325 "A"       "C"        NA         NA         
© www.soinside.com 2019 - 2024. All rights reserved.