连接不同维度的 Dataframe

gblwokeq  于 2023-01-28  发布在  其他
关注(0)|答案(3)|浏览(104)

我的数据存储在三个不同长度的数据框中。下面你可以看到我的数据:

df<-data.frame(  
  retail_seling_price=c(10),
  quantity_10=c(1000)
)

df

df1<-data.frame(  
  retail_seling_price=c(100,200,300),
  quantity_18=c(1000,2000,3000)
)

df1

df2<-data.frame(  
  retail_seling_price=c(100,200,300,400),
  quantity_18=c(1000,2000,3000,0)
)

df2

所以现在我想把所有这些 Dataframe 合并成一个 Dataframe ,如下图所示。

有人能帮我解决这个问题吗?

rbpvctlc

rbpvctlc1#

下面是使用bind_rows的另一种dplyr方法:

library(dplyr)

bind_rows(df, df1, df2) %>% 
  group_by(retail_seling_price) %>% 
  summarize(across(everything(), ~sum(., na.rm = TRUE)))
retail_seling_price quantity_10 quantity_18 quantity_20
                <dbl>       <dbl>       <dbl>       <dbl>
1                  10        1000           0           0
2                 100           0        1000        1000
3                 200           0        2000        2000
4                 300           0        3000        3000
5                 400           0           0           0
cczfrluj

cczfrluj2#

您的df2应该是quantity_20而不是quantity_18吗?如果是这样(在下面固定),这是full_join(对于每对帧)和Reduce在帧列表上的组合,对任意数量的帧执行相同的操作。

library(dplyr)
Reduce(function(a, b) full_join(a, b, by = "retail_seling_price"),
       list(df, df1, df2)) %>%
  mutate(across(everything(), ~ coalesce(., 0)))
#   retail_seling_price quantity_10 quantity_18 quantity_20
# 1                  10        1000           0           0
# 2                 100           0        1000        1000
# 3                 200           0        2000        2000
# 4                 300           0        3000        3000
# 5                 400           0           0           0

坦率地说,我们不需要dplyr,它可以很方便地修复初始连接引入的所有NA值:

Reduce(function(a, b) full_join(a, b, by = "retail_seling_price"),
       list(df, df1, df2))
#   retail_seling_price quantity_10 quantity_18 quantity_20
# 1                  10        1000          NA          NA
# 2                 100          NA        1000        1000
# 3                 200          NA        2000        2000
# 4                 300          NA        3000        3000
# 5                 400          NA          NA           0
dz6r00yl

dz6r00yl3#

使用data.table

library(data.table)
 rbindlist(list(df, df1, df2), fill = TRUE)[,
   lapply(.SD, sum, na.rm = TRUE), by = retail_seling_price]
   retail_seling_price quantity_10 quantity_18
1:                  10        1000           0
2:                 100           0        2000
3:                 200           0        4000
4:                 300           0        6000
5:                 400           0           0

相关问题