我在 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循环,它太慢了。 我尝试使用稀疏矩阵,但在这种情况下我的索引无法转换为整数。
如果我理解正确的话,您正在寻找一个包含两个维度上所有名称的方阵。我认为如果您预先分配输出矩阵并用某些矢量化版本替换 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