加入时将行插入组
Inserting rows into groups while joining
我正在尝试在 R 中加入两个 data.tables。我按名称加入它们,我想将一个数据 table 中的 "insert" 行放入另一个数据的名称组中.
例如:
数据 table A 有 "names" 和 "amounts",数据 table B 有 "names" 和 "addresses"(但每个名称有多个地址)。我想要一个数据 table,其中包含每个名称、相应的地址以及每组名称的单个 "amount"。
我尝试在 dplyr 中使用 "left_join",但是每个 "address" 行的金额列都会重复。
有人有什么想法吗?谢谢。
示例图片(连接 table 1 和 2 创建 3):
甚至像这样:
编辑:添加了一个可重现的示例,说明这两个数据集是什么样的以及所需的输出是什么
table_one <- data.frame(name=c("x","y","z"), amount=c("0","200","300"))
table_two <- data.frame(name=c("x","x","y","z","z","z"), address=c("A","B","C","D","E","F"))
output <- data.frame(name=c("x","x","y","z","z","z"),
address=c("A","B","C","D","E","F"), amount=c("0","","0","0","",""))
给你。
table_one <- data.frame(name=c("x","y","z"), amount=c("0","0","0"))
table_two <- data.frame(name=c("x","x","y","z","z","z"), address=c("A","B","C","D","E","F"))
output <- data.frame(name=c("x","x","y","z","z","z"),
address=c("A","B","C","D","E","F"), amount=c("0","","0","0","",""))
test <- merge(table_one, table_two, by = 'name')
test$amount <- as.character(test$amount)
test$amount[duplicated(test[,c(1,2)])] <- ""
test
使用dplyr
,
library(dplyr)
left_join(table_two, table_one, by = 'name') %>%
mutate(amount = replace(amount, duplicated(name), NA))
# name address amount
#1 x A 0
#2 x B <NA>
#3 y C 200
#4 z D 300
#5 z E <NA>
#6 z F <NA>
我们可以用 match
i1 <- with(table_one, match(name, table_two$name))
table_two$amount <- ""
table_two$amount[i1] <- as.character(table_one$amount)
table_two
# name address amount
#1 x A 0
#2 x B
#3 y C 200
#4 z D 300
#5 z E
#6 z F
我正在尝试在 R 中加入两个 data.tables。我按名称加入它们,我想将一个数据 table 中的 "insert" 行放入另一个数据的名称组中.
例如: 数据 table A 有 "names" 和 "amounts",数据 table B 有 "names" 和 "addresses"(但每个名称有多个地址)。我想要一个数据 table,其中包含每个名称、相应的地址以及每组名称的单个 "amount"。
我尝试在 dplyr 中使用 "left_join",但是每个 "address" 行的金额列都会重复。
有人有什么想法吗?谢谢。
示例图片(连接 table 1 和 2 创建 3):
甚至像这样:
编辑:添加了一个可重现的示例,说明这两个数据集是什么样的以及所需的输出是什么
table_one <- data.frame(name=c("x","y","z"), amount=c("0","200","300"))
table_two <- data.frame(name=c("x","x","y","z","z","z"), address=c("A","B","C","D","E","F"))
output <- data.frame(name=c("x","x","y","z","z","z"),
address=c("A","B","C","D","E","F"), amount=c("0","","0","0","",""))
给你。
table_one <- data.frame(name=c("x","y","z"), amount=c("0","0","0"))
table_two <- data.frame(name=c("x","x","y","z","z","z"), address=c("A","B","C","D","E","F"))
output <- data.frame(name=c("x","x","y","z","z","z"),
address=c("A","B","C","D","E","F"), amount=c("0","","0","0","",""))
test <- merge(table_one, table_two, by = 'name')
test$amount <- as.character(test$amount)
test$amount[duplicated(test[,c(1,2)])] <- ""
test
使用dplyr
,
library(dplyr)
left_join(table_two, table_one, by = 'name') %>%
mutate(amount = replace(amount, duplicated(name), NA))
# name address amount
#1 x A 0
#2 x B <NA>
#3 y C 200
#4 z D 300
#5 z E <NA>
#6 z F <NA>
我们可以用 match
i1 <- with(table_one, match(name, table_two$name))
table_two$amount <- ""
table_two$amount[i1] <- as.character(table_one$amount)
table_two
# name address amount
#1 x A 0
#2 x B
#3 y C 200
#4 z D 300
#5 z E
#6 z F