【问题标题】:Binding rows from list with meaningful duplicates in R [duplicate]将列表中的行与R中有意义的重复项绑定[重复]
【发布时间】:2020-09-11 02:43:22
【问题描述】:

伙计们,我需要逐行合并列表中的不同数据框,并维护重复行中包含的一些信息。每行包含一些变量(股票价格)的日常观察,每个数据框包含不同的时间跨度(年)。从一个数据框到另一个数据框,一些变量可能会发生变化(列 - 指数内的股票)。来自bind_rows 似乎在简单地添加具有新变量的列并将NAs 留在其他地方方面做得很好。

关键是一些数据帧包含上一周期的最后一天(因此已经与前一个数据帧绑定),但它们在显示的变量(列)方面略有不同。我不想完全消除其中一个重复行,因为它们都包含我需要的信息,我宁愿合并它们。重复的行包含相同的值(因为指的是同一天)或一个 NA 和一个值(因为指的是集合中的不同变量)。我能怎么做?

这个问题可以在下面的例子中综合:

library(dplyr)
df_1 <- data.frame(Date=c(1:4),A=c(20,30,20,30),B=c(15,16,15,16)) 
df_2 <- data.frame(Date=c(4:7),A=c(30,35,60,40),C=c(15,18,25,20))
dfs<-list(df_1,df_2)
bind_rows(dfs)

结果:

  Date  A  B  C
1    1 20 15 NA
2    2 30 16 NA
3    3 20 15 NA
4    4 30 16 NA
5    4 30 NA 15
6    5 35 NA 18
7    6 60 NA 25
8    7 40 NA 20

期望的结果:

  Date  A  B  C
1    1 20 15 NA
2    2 30 16 NA
3    3 20 15 NA
4    4 30 16 15
5    5 35 NA 18
6    6 60 NA 25
7    7 40 NA 20

【问题讨论】:

标签: dplyr r list dataframe dplyr tidyverse


【解决方案1】:

您可以通过DateA 列进行完全连接,而不是绑定行。

library(dplyr)
full_join(df_1, df_2, by = c('Date', 'A'))
#Thanks to @duckmayr for the suggestion. 

#   A  B  C
#1 20 15 NA
#2 30 16 NA
#3 20 15 NA
#4 30 16 15
#5 35 NA 18
#6 60 NA 25
#7 40 NA 20

在基础 R 中,可以这样做:

merge(df_1, df_2, by = c('Date', 'A'), all = TRUE)

如果数据在列表中,我们可以使用Reduce

purrr::reduce(dfs, full_join, by = c('Date', 'A'))

或者

Reduce(function(x, y) merge(df_1, df_2, by = c('Date', 'A'), all = TRUE), dfs)

【讨论】:

  • 对不起,我没有提到数据框在列表中
  • @MrFrog 见this post
  • 如果 As 是数百个变量怎么办??
  • @MrFrog 您可以按位置收集列,即cols &lt;- names(df)[1:100],然后在by 参数中使用此cols。或者,如果列中有一些模式,您也可以使用grep
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多