【问题标题】:Merging more than two data frames合并两个以上的数据框
【发布时间】:2020-08-19 14:13:23
【问题描述】:

我正在使用R 来合并两个以上的数据框。每个数据框对应于一年的观察结果,并且有一列唯一标识员工。例如,我会观察两年:

 emp.data <- data.frame(
  emp_id = c (1:5), 
  emp_name = c("Rick","Dan","Michelle","Ryan","Gary"),
  start_date = as.Date(c("2012-01-01", "2013-09-23", "2014-11-15", "2014-05-11",
                         "2015-03-27")),
  salary = c(623.3,515.2,611.0,729.0,843.25), 
  hours=c(100,56,34,65,38),
  
  stringsAsFactors = FALSE
)
# Print the data frame.         
print(emp.data) 

(https://stackoverflow.com/image.jpg)

和:

 emp.data2 <- data.frame(
  emp_id = c (2:6), 
  emp_name = c("Dan","Michelle","Ryan","Gary","Zack"),
  start_date = as.Date(c( "2013-09-23", "2014-11-15", "2014-05-11","2014-02-11",
                         "2015-03-27")),
  salary = c(515.2,611.0,729.0,843.25,10), 
  hours=c(56,34,65,38,9),
  
  stringsAsFactors = FALSE
)
# Print the data frame.         
print(emp.data2) 

请注意,我实际上是在处理一个不平衡的面板:各年的列是相同的,但各年的观察次数可能会有所不同。

基本上,我想将这些数据帧中的大约 10 个合并为一个,我尝试通过以下方式使用函数 merge()

merge(emp.data,emp.data2,by = "emp_id",all.x = TRUE,all.y = TRUE)

但是它使数据框的尺寸与合并的数据框的数量成比例增加,因为它给了我输出列:例如hours.x hours.y。这显然是非常低效的,因为这些重复列中只有一个具有非 NA 值。所以基本上我正在寻找一种方法来合并这些数据框,同时保持列不变并添加一个年份变量。有什么建议吗?

【问题讨论】:

    标签: r dataframe merge panel


    【解决方案1】:
    ## Put the data frames in a list:
    list_of_data = list(emp.data, emp.data.2, emp.data.3, ...)
    ## alternately, do this programmatically, maybe
    # list_of_data = mget(ls(pattern = emp.data.*))
    
    ## Name the list with the years
    names(list_of_data) = c(1996, 2014, 1066, ...)
    
    ## Combine it 
    library(dplyr)
    big_data = bind_rows(list_of_data, .id = "year")
    

    有关这方面的更多详细信息,请参阅我在常见问题解答How to make a list of data frames 中的回答。

    【讨论】:

    • 效果很好,谢谢。一个额外的问题。您对如何处理列可能随时间变化的情况有什么建议吗?例如,有些可能会消失,有些可能会出现。
    • 这种方法仍然有效 - 你只会在它们不存在的年份得到缺失值。
    猜你喜欢
    • 1970-01-01
    • 2019-08-16
    • 2012-10-08
    • 2017-08-15
    • 1970-01-01
    • 2016-11-24
    • 2019-07-26
    • 2015-10-17
    相关资源
    最近更新 更多