r - 将列表中的行与 R 中有意义的重复行绑定(bind)

标签 r list dataframe dplyr tidyverse

<分区>

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

重点是一些数据框包含前一时期的最后一天(因此已经与前一数据框绑定(bind))但它们在显示的变量(列)中略有不同。我不想完全消除重复行之一,因为它们都包含我需要的信息,我宁愿合并它们。重复行包含相同的值(因为指的是同一天)或一个 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

最佳答案

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

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

在 base 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)

关于r - 将列表中的行与 R 中有意义的重复行绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61985842/

相关文章:

r - 如何在字符串中间打印 R 变量

sql - T-SQL,制作列表

python - 根据条件连接列表中的字符串和整数

python - 在 1-10 之间缩放 python 数据框特定列的值

r - 如何删除重复数据的行 (R)

python - Pandas 数据框获取每组的第一行并复制到其他行

r - 在 R 的表中查找值的模式

r - 如何根据 Shiny 应用程序中的一个小部件的选择显示一些小部件

r - 完成序列列并填写行

c++ - 列表迭代器错误 C++