R 用另一个数据帧的相应值填充数据帧

R 用另一个数据帧的相应值填充数据帧,r,optimization,dataframe,R,Optimization,Dataframe,我有一个数据框,其中包含从一个自变量a和B的实验中读取的值,它不包括a和B的所有可能排列。我需要创建一个数据框,它确实包含所有排列,在数据中不存在特定值对的地方使用零 要创建一些示例数据 interactions <- unique(data.frame(A = sample(1:5, 10, replace=TRUE), B = sample(1:5, 10, replace=TRUE))) interactions

我有一个数据框,其中包含从一个自变量a和B的实验中读取的值,它不包括a和B的所有可能排列。我需要创建一个数据框,它确实包含所有排列,在数据中不存在特定值对的地方使用零

要创建一些示例数据

interactions <- unique(data.frame(A = sample(1:5, 10, replace=TRUE), 
                                  B = sample(1:5, 10, replace=TRUE)))
interactions <- interactions[interactions$A < interactions$B, ]
interactions$val <- runif(nrow(interactions))

possible.interactions <- data.frame(t(combn(1:5, 2)))
names(possible.interactions) <- c('A', 'B')

我想要输出

A B  val
1 2  NA
1 3  0.5286560
1 4  NA
1 5  0.6881106
2 3  NA
2 4  0.5026426
2 5  NA
3 4  NA
3 5  NA
4 5  NA

最快的方法是什么?

这里有一个基本解决方案,它比
合并
快得多(~10倍):

possible.interactions$val <- interactions$val[
  match(
    do.call(paste, possible.interactions),
    do.call(paste, interactions[1:2])
) ]
这假设A&B不包含空格,并且
交互
没有重复的
A-B
对(将始终与第一对匹配)

以及
数据表
版本:

possible.DT <- data.table(possible.interactions)
DT <- data.table(interactions, key=c("A", "B"))
DT[possible.DT]  
merge(possible.interactions, interactions, all.x=T)

下面是一个基本解决方案,它比
merge
快得多(~10倍):

possible.interactions$val <- interactions$val[
  match(
    do.call(paste, possible.interactions),
    do.call(paste, interactions[1:2])
) ]
这假设A&B不包含空格,并且
交互
没有重复的
A-B
对(将始终与第一对匹配)

以及
数据表
版本:

possible.DT <- data.table(possible.interactions)
DT <- data.table(interactions, key=c("A", "B"))
DT[possible.DT]  
merge(possible.interactions, interactions, all.x=T)

下面是一个基本解决方案,它比
merge
快得多(~10倍):

possible.interactions$val <- interactions$val[
  match(
    do.call(paste, possible.interactions),
    do.call(paste, interactions[1:2])
) ]
这假设A&B不包含空格,并且
交互
没有重复的
A-B
对(将始终与第一对匹配)

以及
数据表
版本:

possible.DT <- data.table(possible.interactions)
DT <- data.table(interactions, key=c("A", "B"))
DT[possible.DT]  
merge(possible.interactions, interactions, all.x=T)

下面是一个基本解决方案,它比
merge
快得多(~10倍):

possible.interactions$val <- interactions$val[
  match(
    do.call(paste, possible.interactions),
    do.call(paste, interactions[1:2])
) ]
这假设A&B不包含空格,并且
交互
没有重复的
A-B
对(将始终与第一对匹配)

以及
数据表
版本:

possible.DT <- data.table(possible.interactions)
DT <- data.table(interactions, key=c("A", "B"))
DT[possible.DT]  
merge(possible.interactions, interactions, all.x=T)

如果订单对您很重要,我建议您使用
plyr
软件包中的
join
。与
merge
相反,当存在不匹配的元素时,merge不能提供直观的排序

library(plyr)
join(interactions,possible.interactions,type="right")

Joining by: A, B
   A B         val
1  1 2          NA
2  1 3          NA
3  1 4 0.007602083
4  1 5 0.853415110
5  2 3          NA
6  2 4 0.321098658
7  2 5          NA
8  3 4          NA
9  3 5          NA
10 4 5          NA

如果订单对您很重要,我建议您使用
plyr
软件包中的
join
。与
merge
相反,当存在不匹配的元素时,merge不能提供直观的排序

library(plyr)
join(interactions,possible.interactions,type="right")

Joining by: A, B
   A B         val
1  1 2          NA
2  1 3          NA
3  1 4 0.007602083
4  1 5 0.853415110
5  2 3          NA
6  2 4 0.321098658
7  2 5          NA
8  3 4          NA
9  3 5          NA
10 4 5          NA

如果订单对您很重要,我建议您使用
plyr
软件包中的
join
。与
merge
相反,当存在不匹配的元素时,merge不能提供直观的排序

library(plyr)
join(interactions,possible.interactions,type="right")

Joining by: A, B
   A B         val
1  1 2          NA
2  1 3          NA
3  1 4 0.007602083
4  1 5 0.853415110
5  2 3          NA
6  2 4 0.321098658
7  2 5          NA
8  3 4          NA
9  3 5          NA
10 4 5          NA

如果订单对您很重要,我建议您使用
plyr
软件包中的
join
。与
merge
相反,当存在不匹配的元素时,merge不能提供直观的排序

library(plyr)
join(interactions,possible.interactions,type="right")

Joining by: A, B
   A B         val
1  1 2          NA
2  1 3          NA
3  1 4 0.007602083
4  1 5 0.853415110
5  2 3          NA
6  2 4 0.321098658
7  2 5          NA
8  3 4          NA
9  3 5          NA
10 4 5          NA

您是否研究过
merge(x,y,all.x=T)
其中
x
有所有可能的排列<代码>数据。表也能做到这一点,速度更快,但不是最基本的。您是否研究过
合并(x,y,all.x=T)
其中
x
有所有可能的排列<代码>数据。表也能做到这一点,速度更快,但不是最基本的。您是否研究过
合并(x,y,all.x=T)
其中
x
有所有可能的排列<代码>数据。表也能做到这一点,速度更快,但不是最基本的。您是否研究过
合并(x,y,all.x=T)
其中
x
有所有可能的排列<代码>数据。表也可以做到这一点,速度更快,但不是基数。与子集匹配的+1有点不直观会比合并快。不过答案很酷。@BrandonBertelsen,其中一部分原因是
match
在第一次匹配后会停止搜索,而
merge
会进行完整扫描(我相信)。但即使考虑到这一点,它仍然更快。+1有点不直观,匹配子集将比合并更快。不过答案很酷。@BrandonBertelsen,其中一部分原因是
match
在第一次匹配后会停止搜索,而
merge
会进行完整扫描(我相信)。但即使考虑到这一点,它仍然更快。+1有点不直观,匹配子集将比合并更快。不过答案很酷。@BrandonBertelsen,其中一部分原因是
match
在第一次匹配后会停止搜索,而
merge
会进行完整扫描(我相信)。但即使考虑到这一点,它仍然更快。+1有点不直观,匹配子集将比合并更快。不过答案很酷。@BrandonBertelsen,其中一部分原因是
match
在第一次匹配后会停止搜索,而
merge
会进行完整扫描(我相信)。但即使考虑到这一点,它仍然更快。