【问题标题】:how to combine two data frames of different lengths? [duplicate]如何组合两个不同长度的数据帧? [复制]
【发布时间】:2016-12-29 01:26:18
【问题描述】:

我有 2 个数据框。如下:

df1
Date    Duration
6/27/2014   10.00
6/30/2014   20.00
7/11/2014   15.00

df2
Date    Percent_Removal
6/27/2014   20.39
6/30/2014   27.01
7/7/2014    49.84
7/11/2014   59.48
7/17/2014   99.04

我想根据 df1 中的“日期”列合并这两个数据框。输出应如下所示:

df3
Date    Duration_sum    Percent_Removal
6/27/2014   10.00        20.39
6/30/2014   20.00        27.01
7/11/2014   15.00        59.48

我尝试了以下功能:

df1$Date <- as.Date (df1$Date, format= "%m/%d/%Y")
df2$Date <- as.Date (df2$Date, format= "%m/%d/%Y")
df3<- as.data.frame (merge(df1,df2,by.x = "Date",all.x = TRUE))

我的输出是:

df3

 Date      Duration_sum   Percent_Removal
6/27/2014     10.00           NA
6/30/2014     20.00           NA
7/11/2014     15.00           NA

如果有人能帮我解决这个问题,我将不胜感激。提前致谢。

【问题讨论】:

  • merge.data.frame(df1,df2)
  • df3 = merge(df1, df2, by="Date", all.x=TRUE)。这将丢弃df2 中与df1 中的Date 不匹配的所有行。如果您想保留两个数据框中的所有行,无论它们在另一个数据框中是否有匹配项,您都可以使用all=TRUE 而不是all.x=TRUE
  • (1)merge(df1, df2, by = "Date", all = TRUE)的结果是什么? (2) 日期存储为字符值的相同问题。
  • merge(df1, df2, by = "Date", all = TRUE) 仍然没有返回任何值 df3$Percent_Removal.... 与我在问题中对 df3 的结果相同。

标签: r date merge


【解决方案1】:

这对于评论来说太长了,但实际上只需要证明我在 cmets 中提供的解决方案确实有效。如果您在合并工作时遇到问题,那么您的数据肯定存在其他问题,我们无法诊断,因为您没有提供 data.frames 的输入

df1 = read.table(text = 
"Date    Duration
6/27/2014   10.00
6/30/2014   20.00
7/11/2014   15.00",
header = T)

df2 = read.table(text = 
"Date    Percent_Removal
6/27/2014   20.39
6/30/2014   27.01
7/7/2014    49.84
7/11/2014   59.48
7/17/2014   99.04",
header = T)

df1$Date <- as.Date (df1$Date, format= "%m/%d/%Y")
df2$Date <- as.Date (df2$Date, format= "%m/%d/%Y")

df3 = merge(df1,df2)
#         Date Duration Percent_Removal
# 1 2014-06-27       10           20.39
# 2 2014-06-30       20           27.01
# 3 2014-07-11       15           59.48

请注意,不需要在合并语句中指定其他选项,因为

  1. 默认值by = 是两个数据框共有的列名。在这种情况下,仅共享 Date
  2. all.xall.yall 的默认值提供了所需的行为,即只保留两个数据帧中的行。

【讨论】:

  • 很抱歉,实际上我的日期值有一个小问题。我修复了它,现在合并功能工作正常。非常感谢您的帮助。
【解决方案2】:

您可能会超级懒惰并完全避免制作第三个df:

 df1$Percent_removal<-df2$Percent_removal[df2$Date==df1$Date]

这只有在每个 df 中每个日期只有 1 个实例时才有效。更细微的方法可能是使用 plyr 包。

【讨论】:

  • 收到错误消息:“较长的对象长度不是较短对象长度的倍数”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 2020-02-20
  • 2013-09-29
  • 1970-01-01
相关资源
最近更新 更多