【问题标题】:R: Merging two dataframes without multiplying rowsR:合并两个数据帧而不增加行
【发布时间】:2020-06-24 09:24:39
【问题描述】:

我有两个要合并的数据框:

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 

我尝试过 merge & 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 的名称),但我希望按天加入这两个数据帧,而不会使行的长度完全相乘。请指教

【问题讨论】:

  • ?您声明:完全没有改变行的长度 - 但您的期望结果 比“df1”多 1 行??
  • @NelsonGon,我尝试过 merge & join_all 但他们将我的行与 df2 中“支出”列的每个不同值的重复“日”和“名称”相乘
  • @dario,我的错让我改写声明

标签: r dataframe join merge bind


【解决方案1】:

如果不添加 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

【讨论】:

  • 感谢您的回答!但我得到了这个:错误:by 不能包含 LHS 中缺少的连接列 time
  • 你确定吗?只需将命令复制并粘贴到您的 R 会话中即可。
【解决方案2】:

这是一个基本的 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

【讨论】:

    猜你喜欢
    • 2020-12-07
    • 2014-04-14
    • 2018-05-31
    • 2019-03-29
    • 2015-08-12
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多