如何在不复制原始数据值的情况下加入 R 中的数据帧
How to join data frames in R without duplicating original data values
我有 2 个数据框(DF1
和 DF2
),其中 1 个想通过一个名为 "acc_num"
的唯一值将它们连接在一起。在 DF2
中,acc_num A
支付了两次,B
支付了三次。数据框如下
DF1:
acc_num total_use sales
A 433 145
A NA 2
A NA 18
B 149 32
DF2:
acc payment
A 150
A 98
B 44
B 15
B 10
我想要的输出是:
acc_num total_use sales payment
A 433 145 150
A NA 2 98
A NA 18 NA
B 149 32 44
B NA NA 15
B NA NA 10
我已经尝试了 full_join
和 merge
,但输出结果并不理想。我无法解决这个问题,因为我仍然是 R 的初学者,还没有找到解决方案。
我使用的代码示例是
test_full_join <- DF1 %>% full_join(DF2, by = c("acc_num" = "acc"))
显示的输出是:
acc_num total_use sales payment
A 433 145 150
A 433 145 98
A NA 2 150
A NA 2 98
A NA 18 150
A NA 18 98
B 149 32 44
B 149 32 15
B 149 32 10
这与我最后想要的输出相反,
我关心的是获得 total_use
、sales
和 payment
的总和。
这个输出肯定会给我错误的解释
用于稍后的数据可视化。
我们可能需要根据 'acc_num'
通过 row_number()
进行连接
library(dplyr)
df1 %>%
group_by(acc_num) %>%
mutate(grpind = row_number()) %>%
full_join(df2 %>%
group_by(acc_num = acc) %>%
mutate(grpind = row_number())) %>%
select(acc_num, total_use, sales, payment)
# A tibble: 6 x 4
# Groups: acc_num [2]
# acc_num total_use sales payment
# <chr> <int> <int> <int>
#1 A 433 145 150
#2 A NA 2 98
#3 A NA 18 NA
#4 B 149 32 44
#5 B NA NA 15
#6 B NA NA 10
数据
df1 <- structure(list(acc_num = c("A", "A", "A", "B"), total_use = c(433L,
NA, NA, 149L), sales = c(145L, 2L, 18L, 32L)), class = "data.frame",
row.names = c(NA,
-4L))
df2 <- structure(list(acc = c("A", "A", "B", "B", "B"), payment = c(150L,
98L, 44L, 15L, 10L)), class = "data.frame", row.names = c(NA,
-5L))
我有 2 个数据框(DF1
和 DF2
),其中 1 个想通过一个名为 "acc_num"
的唯一值将它们连接在一起。在 DF2
中,acc_num A
支付了两次,B
支付了三次。数据框如下
DF1:
acc_num total_use sales
A 433 145
A NA 2
A NA 18
B 149 32
DF2:
acc payment
A 150
A 98
B 44
B 15
B 10
我想要的输出是:
acc_num total_use sales payment
A 433 145 150
A NA 2 98
A NA 18 NA
B 149 32 44
B NA NA 15
B NA NA 10
我已经尝试了 full_join
和 merge
,但输出结果并不理想。我无法解决这个问题,因为我仍然是 R 的初学者,还没有找到解决方案。
我使用的代码示例是
test_full_join <- DF1 %>% full_join(DF2, by = c("acc_num" = "acc"))
显示的输出是:
acc_num total_use sales payment
A 433 145 150
A 433 145 98
A NA 2 150
A NA 2 98
A NA 18 150
A NA 18 98
B 149 32 44
B 149 32 15
B 149 32 10
这与我最后想要的输出相反,
我关心的是获得 total_use
、sales
和 payment
的总和。
这个输出肯定会给我错误的解释
用于稍后的数据可视化。
我们可能需要根据 'acc_num'
通过row_number()
进行连接
library(dplyr)
df1 %>%
group_by(acc_num) %>%
mutate(grpind = row_number()) %>%
full_join(df2 %>%
group_by(acc_num = acc) %>%
mutate(grpind = row_number())) %>%
select(acc_num, total_use, sales, payment)
# A tibble: 6 x 4
# Groups: acc_num [2]
# acc_num total_use sales payment
# <chr> <int> <int> <int>
#1 A 433 145 150
#2 A NA 2 98
#3 A NA 18 NA
#4 B 149 32 44
#5 B NA NA 15
#6 B NA NA 10
数据
df1 <- structure(list(acc_num = c("A", "A", "A", "B"), total_use = c(433L,
NA, NA, 149L), sales = c(145L, 2L, 18L, 32L)), class = "data.frame",
row.names = c(NA,
-4L))
df2 <- structure(list(acc = c("A", "A", "B", "B", "B"), payment = c(150L,
98L, 44L, 15L, 10L)), class = "data.frame", row.names = c(NA,
-5L))