【问题标题】:Merging two dataframes but different column values合并两个数据框但不同的列值
【发布时间】:2015-03-06 21:07:50
【问题描述】:

抱歉,我是 R 新手,非常感谢您对此提供帮助。我正在尝试根据时间合并以下两个数据框(劳动生产率和抑郁框):

Time            LabourProductivity
1 2004 Q1   96.6
2      Q2   96.9
3      Q3   96.9
4      Q4   97.1
5 2005 Q1   97.6
6      Q2   99.0

Time    DepressionCount
1 2004          875
2 2004.25   820
3 2004.5    785
4 2004.75   857
5 2005          844
6 2005.25   841

由于它们都有不同的时间值,我不知道如何合并它们。理想情况下,它看起来像:

Time    DepressionCount LabourProductivity
1 2004  875             96.6
2 2004  820             96.9
3 2004  785             96.9
4 2004  857             97.1
5 2005  844             97.6
6 2005  841             99.0

【问题讨论】:

    标签: r merge dataframe


    【解决方案1】:

    如果“df1”和“df2”是第一个和第二个数据集,则根据“df1”的“时间”列创建一个分组索引(“indx”)。使用aveas.yearqtr 将“时间”列转换为与“df2”类似的格式

    library(zoo)
    indx <-  cumsum(grepl('^\\d+', df1$Time))
    df1$Time <- with(df1, as.numeric(ave(Time, indx, FUN= function(x)  {
            x[-1] <- paste (sub(' .*', '', x[1]), x[-1])
            as.yearqtr(x) })))
    

    merge 数据集,transform“时间”列(如果需要)

    transform(merge(df1, df2), Time=trunc(Time))
    #    Time LabourProductivity DepressionCount
    #1 2004               96.6             875
    #2 2004               96.9             820
    #3 2004               96.9             785
    #4 2004               97.1             857
    #5 2005               97.6             844
    #6 2005               99.0             841
    

    或使用data.table

    library(data.table)
     setDT(df1)[, TimeN:= as.numeric(as.yearqtr(c(Time[1L],
        paste(sub(' .*', '', Time[1L]), Time[-1L])))), 
          list(Grp=cumsum(grepl('^\\d+', Time)))][,
                Time:= TimeN][, TimeN:=NULL][]
    
     setkey(df1, Time)[df2][, Time:=trunc(Time)][]
     #   Time LabourProductivity DepressionCount
     #1: 2004               96.6             875
     #2: 2004               96.9             820
     #3: 2004               96.9             785
     #4: 2004               97.1             857
     #5: 2005               97.6             844
     #6: 2005               99.0             841
    

    数据

    df1 <- structure(list(Time = c("2004 Q1", "Q2", "Q3", "Q4", "2005 Q1", 
    "Q2"), LabourProductivity = c(96.6, 96.9, 96.9, 97.1, 97.6, 99
    )), .Names = c("Time", "LabourProductivity"), class = "data.frame", 
    row.names = c("1", "2", "3", "4", "5", "6"))
    
    df2 <- structure(list(Time = c(2004, 2004.25, 2004.5, 2004.75, 2005, 
    2005.25), DepressionCount = c(875L, 820L, 785L, 857L, 844L, 841L
     )), .Names = c("Time", "DepressionCount"), class = "data.frame", 
     row.names = c("1", "2", "3", "4", "5", "6"))
    

    【讨论】:

    • 得到以下错误:“labourproductivity$Time
    • @DavidResch 你可以试试我帖子中显示的数据吗?
    • 是的,太棒了。我的两个系列的数据都到 2013 年底,所以我应该添加其余的值还是有更快的方法。非常感谢您的帮助!
    • @DavidResch ave 非常快,对于merge 部分,您可以使用dplyrdata.table 或其中任一包中的所有方法
    • @DavidResch 更新了可能的 data.table 方法。
    猜你喜欢
    • 2018-12-10
    • 2013-02-04
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2022-01-01
    • 2020-10-20
    • 2022-01-10
    • 2015-03-21
    相关资源
    最近更新 更多