【问题标题】:Repeating certain columns when merging two data frames of different length (pasting?)合并两个不同长度的数据帧时重复某些列(粘贴?)
【发布时间】:2019-02-16 11:48:12
【问题描述】:

我有两个用于事件研究的数据框,并且在准备数据以进行分析时有些吃力。 df1 有两行包含公司 ID 和事件日期。一些公司有多个事件日期,因此每个事件日期都会列出公司 ID(这意味着列数多于唯一的公司 ID)。另一个 (df2) 包含每家公司的股价:第 1 行是公司 ID,下面的每一行是该特定公司在第 1 列中指定的不同日期的股价。

我想合并(或粘贴?)这两个数据框,以便对于 df1 中的每个公司 ID,它将 df2 的匹配公司 ID(股价)下方的信息复制到自己。

我已经四处寻找解决方案,但目前我似乎不擅长搜索,因为我的搜索没有产生显着的结果。我尝试了不同的合并命令和 expand.grid,但我对 r 生疏了。

df1 <- data.frame(X1 = c("Event date","Company ID"),
               X2 = c("2018-01-01","AA"),
               X3 = c("2017-05-03","BB"),
               X4 = c("2016-04-08","CC"),
               X5 = c("2015-02-02","BB"))
df2 <- data.frame(X1 = c("Date","2018-12-31","2018-01-01","2017-05-03","2016-12-31","2016-04-08","2015-02-02"),
               X2 = c("AA",100,102,101,98,99,99),
               X3 = c("BB",85,78,80,77,75,74),
               X4 = c("CC",55,53,54,55,54,54))


df-desired <- data.frame(X1 = c("Event date","Company ID","2018-12-31","2018-01-01","2017-05-03","2016-12-31","2016-04-08","2015-02-02"),
             X2 = c("2018-01-01","AA",100,102,101,98,99,99),
             X3 = c("2017-05-03","BB",85,78,80,77,75,74),
             X4 = c("2016-04-08","CC",55,53,54,55,54,54),
             X5 = c("2015-02-02","BB",85,78,80,77,75,74))

我当前的数据类似于 df1 和 df2,我想要的结果是 df-desired。如果有人能帮助我解决我应该研究的命令,我将不胜感激。我想不出我应该把精力花在什么命令上,所以我希望有人能指出我正确的方向!

【问题讨论】:

  • 这对于您的data.frames 来说是一种非常尴尬的格式(df1df2 的第一行似乎包含列名?);你确定示例数据正确吗?
  • 这是我的实际数据目前的样子,但可能比我想象的更糟? (它弄乱了日期,因为我在第 1 列的第一行中有文本,它保存了日期)。 df1 可以将“事件日期”作为第 1 行的名称,将“公司 ID”作为第 2 行的名称,第一列可以为空并以“日期”作为名称。 df2 可以将“日期”作为第一列的名称,将“公司 ID”作为第 1 行的名称。
  • 这些操作的目的是什么?
  • 我正在对有关公司的某些事件进行事件研究,调查这些事件是否会影响股价。 df1 包含有关事件发生时间和公司的信息。 df2 包含整个样本中每家公司的股价。因此,对于 df1 中的每个事件日期,我需要获取特定公司在我指定的时间段内的股价

标签: r


【解决方案1】:

一种近似方法是在列重命名后使用dplyr::union() 函数:

colnames(df1) = df1[2,]
colnames(df1)[1] = "Date"

colnames(df2) = df2[1,]

dplyr::union(df1,df2)

#        Date         AA         BB         CC         BB
#1 2015-02-02         99         74         54         74
#2 2016-04-08         99         75         54         75
#3 2016-12-31         98         77         55         77
#4 2017-05-03        101         80         54         80
#5 2018-01-01        102         78         53         78
#6 2018-12-31        100         85         55         85
#7       Date         AA         BB         CC         BB
#8 Company ID         AA         BB         CC         BB
#9 Event date 2018-01-01 2017-05-03 2016-04-08 2017-05-03

你终于可以删除重复的行了

【讨论】:

  • 谢谢!我已经研究过了,这看起来很棒!对于任何阅读并尝试使用原始帖子中的代码复制它的人,我必须添加 as.character(unlist 才能使其工作: colnames(df1) = as.character(unlist(df1[2,]))跨度>
猜你喜欢
  • 2019-02-27
  • 1970-01-01
  • 2014-08-13
  • 2020-04-10
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
相关资源
最近更新 更多