R:合并两个数据帧而不乘以行
R: Merging two dataframes without multiplying rows
我有两个要合并的数据框:
df1:
Day name
1 A
1 B
1 C
2 A
2 B
2 C
3 A
3 B
df2:
Day spending
2 25
2 30
3 20
3 15
3 10
期望的结果:
Day name spending
1 A NA
1 B NA
1 C NA
2 A 25
2 B 30
2 C NA
3 A 20
3 B 15
3 NA 10
我试过合并 & join_all,但我得到的只是:
Day name spending
1 A NA
1 B NA
1 C NA
2 A 25
2 A 30
2 B 25
2 B 30
2 C NA
3 A 20
3 A 15
3 A 10
3 B 20
3 B 15
3 B 10
3 NA 20
3 NA 15
3 NA 10
请注意,尽管某些列中缺少数据(例如 df2 中的第 1 天数据和 df1 中缺少 C 的名称),但我希望按天连接两个数据帧,而行的长度根本不会相乘。请指教
如果不添加 time
变量,这是不可能的。
library(dplyr) #
full_join(
df1 %>% group_by(Day) %>% mutate(time=row_number()),
df2 %>% group_by(Day) %>% mutate(time=row_number()),
by=c("Day", "time"))
# A tibble: 9 x 4
# Groups: Day [3]
Day name time spending
<int> <fct> <int> <int>
1 1 A 1 NA
2 1 B 2 NA
3 1 C 3 NA
4 2 A 1 25
5 2 B 2 30
6 2 C 3 NA
7 3 A 1 20
8 3 B 2 15
9 3 NA 3 10
这是一个基本的 R 解决方案,使用 ave
+ merge
+ subset
,即
df1$id <- ave(1:nrow(df1),df1$Day,FUN = seq_along)
df2$id <- ave(1:nrow(df2),df2$Day,FUN = seq_along)
dfout <- subset(merge(df1,df2,by = c("Day","id"),all = TRUE),select = -id)
这样
> dfout
Day name spending
1 1 A NA
2 1 B NA
3 1 C NA
4 2 A 25
5 2 B 30
6 2 C NA
7 3 A 20
8 3 B 15
9 3 <NA> 10
我有两个要合并的数据框:
df1:
Day name
1 A
1 B
1 C
2 A
2 B
2 C
3 A
3 B
df2:
Day spending
2 25
2 30
3 20
3 15
3 10
期望的结果:
Day name spending
1 A NA
1 B NA
1 C NA
2 A 25
2 B 30
2 C NA
3 A 20
3 B 15
3 NA 10
我试过合并 & join_all,但我得到的只是:
Day name spending
1 A NA
1 B NA
1 C NA
2 A 25
2 A 30
2 B 25
2 B 30
2 C NA
3 A 20
3 A 15
3 A 10
3 B 20
3 B 15
3 B 10
3 NA 20
3 NA 15
3 NA 10
请注意,尽管某些列中缺少数据(例如 df2 中的第 1 天数据和 df1 中缺少 C 的名称),但我希望按天连接两个数据帧,而行的长度根本不会相乘。请指教
如果不添加 time
变量,这是不可能的。
library(dplyr) #
full_join(
df1 %>% group_by(Day) %>% mutate(time=row_number()),
df2 %>% group_by(Day) %>% mutate(time=row_number()),
by=c("Day", "time"))
# A tibble: 9 x 4
# Groups: Day [3]
Day name time spending
<int> <fct> <int> <int>
1 1 A 1 NA
2 1 B 2 NA
3 1 C 3 NA
4 2 A 1 25
5 2 B 2 30
6 2 C 3 NA
7 3 A 1 20
8 3 B 2 15
9 3 NA 3 10
这是一个基本的 R 解决方案,使用 ave
+ merge
+ subset
,即
df1$id <- ave(1:nrow(df1),df1$Day,FUN = seq_along)
df2$id <- ave(1:nrow(df2),df2$Day,FUN = seq_along)
dfout <- subset(merge(df1,df2,by = c("Day","id"),all = TRUE),select = -id)
这样
> dfout
Day name spending
1 1 A NA
2 1 B NA
3 1 C NA
4 2 A 25
5 2 B 30
6 2 C NA
7 3 A 20
8 3 B 15
9 3 <NA> 10