合并两个“data.table”对象
Merge two `data.table` objects
我有两个数据集,我想将第二个数据集映射到第一个数据集:
n <- c(2, 3, 5,6,7,8)
s <- c("aa", "bb", "cc","aa", "bb", "cc")
b <- c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE)
df <- data.table(n, s, b)
rs <- c("aa", "bb", "cc")
replace1 <- c("Product 1", "Product 2", "Product 3")
replace2 <- c("Customer 1", "Customer 2", "Customer 3")
df.replace <- data.table(rs, replace1, replace2)
所以基本上如果 df
是一个 aa
,我想添加一个包含 Product 1
和 Customer 1
的列。
此外,我还使用 data.table
包来提高速度,因为我的文件每个都大于 2 GB。映射文件以及我必须将值映射到的文件。
关于如何在 R 中实现这个的任何建议?
更新
我想要的输出:
您只需要使用 data.table
的二进制连接来执行 右连接
setkey(df, s) # key `df` by `s`
(Res <- df[df.replace]) # Perform the binary join
# n s b replace1 replace2
# 1: 2 aa TRUE Product 1 Customer 1
# 2: 6 aa FALSE Product 1 Customer 1
# 3: 3 bb FALSE Product 2 Customer 2
# 4: 7 bb TRUE Product 2 Customer 2
# 5: 5 cc TRUE Product 3 Customer 3
# 6: 8 cc FALSE Product 3 Customer 3
编辑
或者(根据您的评论)您还可以使用二进制联接
进行左联接
setkey(df.replace, rs) # key `df.replace` by `rs`
setkey(df, s) # key `df` by `s`
(Res <- df.replace[df])
# rs replace1 replace2 n b
# 1: aa Product 1 Customer 1 2 TRUE
# 2: aa Product 1 Customer 1 6 FALSE
# 3: bb Product 2 Customer 2 3 FALSE
# 4: bb Product 2 Customer 2 7 TRUE
# 5: cc Product 3 Customer 3 5 TRUE
# 6: cc Product 3 Customer 3 8 FALSE
使用此联接,如果 df.replace
中有不匹配的值,它不会从 df
中删除行并将 NA
分配给相关列
更好的选择(如果您在 df.replace
中没有太多列)是通过引用 df
来分配这些值。这样,您就不需要将结果保存在任何地方,并且 df
会自行更新。
setkey(df, s) # key `df` by `s`
df[df.replace,
`:=`(replace1 = replace1,
replace2 = replace2)
] # Perform the binary join and save results in `df`
我有两个数据集,我想将第二个数据集映射到第一个数据集:
n <- c(2, 3, 5,6,7,8)
s <- c("aa", "bb", "cc","aa", "bb", "cc")
b <- c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE)
df <- data.table(n, s, b)
rs <- c("aa", "bb", "cc")
replace1 <- c("Product 1", "Product 2", "Product 3")
replace2 <- c("Customer 1", "Customer 2", "Customer 3")
df.replace <- data.table(rs, replace1, replace2)
所以基本上如果 df
是一个 aa
,我想添加一个包含 Product 1
和 Customer 1
的列。
此外,我还使用 data.table
包来提高速度,因为我的文件每个都大于 2 GB。映射文件以及我必须将值映射到的文件。
关于如何在 R 中实现这个的任何建议?
更新
我想要的输出:
您只需要使用 data.table
的二进制连接来执行 右连接
setkey(df, s) # key `df` by `s`
(Res <- df[df.replace]) # Perform the binary join
# n s b replace1 replace2
# 1: 2 aa TRUE Product 1 Customer 1
# 2: 6 aa FALSE Product 1 Customer 1
# 3: 3 bb FALSE Product 2 Customer 2
# 4: 7 bb TRUE Product 2 Customer 2
# 5: 5 cc TRUE Product 3 Customer 3
# 6: 8 cc FALSE Product 3 Customer 3
编辑
或者(根据您的评论)您还可以使用二进制联接
进行左联接setkey(df.replace, rs) # key `df.replace` by `rs`
setkey(df, s) # key `df` by `s`
(Res <- df.replace[df])
# rs replace1 replace2 n b
# 1: aa Product 1 Customer 1 2 TRUE
# 2: aa Product 1 Customer 1 6 FALSE
# 3: bb Product 2 Customer 2 3 FALSE
# 4: bb Product 2 Customer 2 7 TRUE
# 5: cc Product 3 Customer 3 5 TRUE
# 6: cc Product 3 Customer 3 8 FALSE
使用此联接,如果 df.replace
中有不匹配的值,它不会从 df
中删除行并将 NA
分配给相关列
更好的选择(如果您在 df.replace
中没有太多列)是通过引用 df
来分配这些值。这样,您就不需要将结果保存在任何地方,并且 df
会自行更新。
setkey(df, s) # key `df` by `s`
df[df.replace,
`:=`(replace1 = replace1,
replace2 = replace2)
] # Perform the binary join and save results in `df`