我有以下两个数据集( data1 和 data2 ),并且希望在所有可能情况下基于匹配变量进行匹配。
data1 <- data.frame(
match = c(rep("a",7),rep("b",7),rep("c",3),rep("d",2))
)
data2 <- data.frame(
match = c(rep("a",4),rep("b",5),rep("c",2),rep("d",9)),
unit1 =
c(300,200,300,600,250,100,90,50,10,9,9.5,80,90,50,20,30,40,70,15,190)
)
为了创建以下格式的单个数据集: 另外值得注意的是,这些数据集很大,因此需要一种有效的方法来进行这种匹配。
match unit1_1 unit1_2 unit1_3 unit1_4 unit1_5 unit1_6 unit1_7 unit1_8 unit1_9
a 300 200 300 600
a 300 200 300 600
a 300 200 300 600
a 300 200 300 600
a 300 200 300 600
a 300 200 300 600
a 300 200 300 600
b 250 100 90 50 10
b 250 100 90 50 10
b 250 100 90 50 10
b 250 100 90 50 10
b 250 100 90 50 10
b 250 100 90 50 10
b 250 100 90 50 10
c 9 9.5
c 9 9.5
c 9 9.5
d 80 90 50 20 30 40 70 15 190
d 80 90 50 20 30 40 70 15 190
答案 0 :(得分:1)
您可以通过几种方式执行此操作,此处使用data.table
函数:
library( data.table )
setDT( data2 )
setDT( data1 )
添加一列以帮助转换为宽格式,并按照您希望的方式设置列名称。
data2[ , record := paste0( "unit1_", seq_len( .N ) ), by = match ]
从长格式转换为宽格式。
data3 <- dcast( data2, match ~ record, value.var = "unit1", fill = NA_real_ )
现在使用match
列将其与您的初始data1
集合
data4 <- merge( data1, data3, by = "match", all = TRUE )
data4
# match unit1_1 unit1_2 unit1_3 unit1_4 unit1_5 unit1_6 unit1_7 unit1_8 unit1_9
# 1: a 300 200.0 300 600 NA NA NA NA NA
# 2: a 300 200.0 300 600 NA NA NA NA NA
# 3: a 300 200.0 300 600 NA NA NA NA NA
# 4: a 300 200.0 300 600 NA NA NA NA NA
# 5: a 300 200.0 300 600 NA NA NA NA NA
# 6: a 300 200.0 300 600 NA NA NA NA NA
# 7: a 300 200.0 300 600 NA NA NA NA NA
# 8: b 250 100.0 90 50 10 NA NA NA NA
# 9: b 250 100.0 90 50 10 NA NA NA NA
# 10: b 250 100.0 90 50 10 NA NA NA NA
# 11: b 250 100.0 90 50 10 NA NA NA NA
# 12: b 250 100.0 90 50 10 NA NA NA NA
# 13: b 250 100.0 90 50 10 NA NA NA NA
# 14: b 250 100.0 90 50 10 NA NA NA NA
# 15: c 9 9.5 NA NA NA NA NA NA NA
# 16: c 9 9.5 NA NA NA NA NA NA NA
# 17: c 9 9.5 NA NA NA NA NA NA NA
# 18: d 80 90.0 50 20 30 40 70 15 190
# 19: d 80 90.0 50 20 30 40 70 15 190