按条件合并多列
Merge with multiple columns by conditions
我想按条件合并我的数据。我浏览了很多网站,但没有找到我想要的。
我这里有两个数据:
# dt1
ColA1 ColA2 ColB ColC ColD Area
TA43 TI44 S2230 Amy 2014-08-08 USA
TA63 TI64 T1205 Andy 2014-01-01 CANADA
TA28 TI100 L1288 Peter 2014-01-08 EU
TA28 TI100 L2231 Roger 2014-01-08 EU
TA92 NA A2206 Jean 2014-01-12 China
TA14 NA E2240 Freda 2014-01-05 Japan
TA69 TI50 N1029 Tina 2014-01-05 Mexico
# dt2
ColA ColB ColC ColD TYPE
TI64 T1205 Andy 2014-01-01 I
TI100 L1288 Peter 2014-01-08 I
TI100 L2231 Roger 2014-01-08 I
TA92 A2206 Jean 2014-01-12 A
TA14 E2240 Freda 2014-01-05 R
TA69 N1029 Tina 2014-01-05 A
我要的是:
ColA ColB ColC ColD TYPE Area
TI64 T1205 Andy 2014-01-01 I CANADA
TI100 L1288 Peter 2014-01-08 I EU
TI100 L2231 Roger 2014-01-08 I EU
TA92 A2206 Jean 2014-01-12 A China
TA14 E2240 Freda 2014-01-05 R Japan
TA69 N1029 Tina 2014-01-05 A Mexico
我在这里解释一下:
我想通过 ColA、ColB、ColC 和 ColD 将 dt1
映射到 dt2
。
如果dt2
中的TYPE
列是A和R,则按[=13中的ColA
合并=] ColA1
在 dt1
.
如果 dt2
中的 TYPE
列是 I,则通过 dt2
中的 ColA
与 [=12 中的 ColA2
合并=].
对 data.table
有什么想法吗?
这将通过 dplyr
获得所需的输出。您也可以使用 inner_join
或 right_join
,具体取决于您要实现的目标:
library(dplyr)
library(tidyr)
dt2 %>% mutate(merge_col = ifelse(TYPE == "I","ColA2","ColA1")) %>%
left_join(dt1 %>% gather(merge_col,ColA,ColA1,ColA2))
# Joining, by = c("ColA", "ColB", "ColC", "merge_col")
# ColA ColB ColC ColD TYPE merge_col Area
# 1 TI64 T1205 Andy 2014-01-01 I ColA2 CANADA
# 2 TI100 L1288 Peter 2014-01-08 I ColA2 EU
# 3 TI100 L2231 Roger 2014-01-08 I ColA2 EU
# 4 TA92 A2206 Jean 2014-01-12 A ColA1 China
# 5 TA14 E2240 Freda 2014-01-05 R ColA1 Japan
# 6 TA69 N1029 Tina 2014-01-05 A ColA1 Mexico
data.table
with data.table 你可以试试这个,这是准确的翻译:
merge(
dt2[,merge_col := ifelse(dt2$TYPE == "I","ColA2","ColA1")],
melt(dt1,id = c("ColB","ColC","ColD","Area"),measure=c("ColA1","ColA2"),"merge_col","ColA"),
all.x = TRUE
)
根据您想要的联接类型调整参数 all.x
和 all.y
我想按条件合并我的数据。我浏览了很多网站,但没有找到我想要的。
我这里有两个数据:
# dt1
ColA1 ColA2 ColB ColC ColD Area
TA43 TI44 S2230 Amy 2014-08-08 USA
TA63 TI64 T1205 Andy 2014-01-01 CANADA
TA28 TI100 L1288 Peter 2014-01-08 EU
TA28 TI100 L2231 Roger 2014-01-08 EU
TA92 NA A2206 Jean 2014-01-12 China
TA14 NA E2240 Freda 2014-01-05 Japan
TA69 TI50 N1029 Tina 2014-01-05 Mexico
# dt2
ColA ColB ColC ColD TYPE
TI64 T1205 Andy 2014-01-01 I
TI100 L1288 Peter 2014-01-08 I
TI100 L2231 Roger 2014-01-08 I
TA92 A2206 Jean 2014-01-12 A
TA14 E2240 Freda 2014-01-05 R
TA69 N1029 Tina 2014-01-05 A
我要的是:
ColA ColB ColC ColD TYPE Area
TI64 T1205 Andy 2014-01-01 I CANADA
TI100 L1288 Peter 2014-01-08 I EU
TI100 L2231 Roger 2014-01-08 I EU
TA92 A2206 Jean 2014-01-12 A China
TA14 E2240 Freda 2014-01-05 R Japan
TA69 N1029 Tina 2014-01-05 A Mexico
我在这里解释一下:
我想通过 ColA、ColB、ColC 和 ColD 将 dt1
映射到 dt2
。
如果dt2
中的TYPE
列是A和R,则按[=13中的ColA
合并=] ColA1
在 dt1
.
如果 dt2
中的 TYPE
列是 I,则通过 dt2
中的 ColA
与 [=12 中的 ColA2
合并=].
对 data.table
有什么想法吗?
这将通过 dplyr
获得所需的输出。您也可以使用 inner_join
或 right_join
,具体取决于您要实现的目标:
library(dplyr)
library(tidyr)
dt2 %>% mutate(merge_col = ifelse(TYPE == "I","ColA2","ColA1")) %>%
left_join(dt1 %>% gather(merge_col,ColA,ColA1,ColA2))
# Joining, by = c("ColA", "ColB", "ColC", "merge_col")
# ColA ColB ColC ColD TYPE merge_col Area
# 1 TI64 T1205 Andy 2014-01-01 I ColA2 CANADA
# 2 TI100 L1288 Peter 2014-01-08 I ColA2 EU
# 3 TI100 L2231 Roger 2014-01-08 I ColA2 EU
# 4 TA92 A2206 Jean 2014-01-12 A ColA1 China
# 5 TA14 E2240 Freda 2014-01-05 R ColA1 Japan
# 6 TA69 N1029 Tina 2014-01-05 A ColA1 Mexico
data.table
with data.table 你可以试试这个,这是准确的翻译:
merge(
dt2[,merge_col := ifelse(dt2$TYPE == "I","ColA2","ColA1")],
melt(dt1,id = c("ColB","ColC","ColD","Area"),measure=c("ColA1","ColA2"),"merge_col","ColA"),
all.x = TRUE
)
根据您想要的联接类型调整参数 all.x
和 all.y