【问题标题】:R - aggregate multiple data frames based on chronologically ordered dataR - 根据时间顺序的数据聚合多个数据帧
【发布时间】:2020-11-20 15:03:53
【问题描述】:

我有几个数据框,其中包含有关临时订购案例的信息和一个补充变量。我想合并数据帧以获得单个帧,其中情况仍按时间顺序排列并与正确的变量值相关联。

一个最小的工作示例是:

Cases <- c("Flanders", "Flanders", "Wallonia", "Wallonia")
From <- c(1830, 1900, 1830, 1950)
To   <- c(1899, 2020, 1949, 2020)
Variable1 <- c(0, 1, 0, 1)
Variable1.df <- data.frame(Cases, From, To, Variable1)

Cases <- c("Flanders", "Flanders", "Flanders", "Wallonia", "Wallonia", "Wallonia")
From <- c(1830, 1871, 1946, 1830, 1931, 1976)
To   <- c(1870, 1945, 2020, 1930, 1975, 2020)
Variable2 <- c(0, 1, 0, 0, 0, 1)
Variable2.df <- data.frame(Cases, From, To, Variable2)

Cases <- c("Flanders", "Flanders", "Flanders", "Flanders", "Flanders", "Wallonia", "Wallonia", "Wallonia", "Wallonia", "Wallonia")
From <- c(1830, 1850, 1900, 1950, 2000, 1830, 1850, 1900, 1950, 2010)
To   <- c(1849, 1899, 1949, 1999, 2020, 1849, 1899, 1949, 2009, 2020)
Variable3 <- c(0, 1, 0, 0, 1, 0, 1, 0, 0, 1)
Variable3.df <- data.frame(Cases, From, To, Variable3)

我正在寻找的输出将是:

Cases     From  To    Variable1  Variable2  Variable3
Flanders  1830  1849  0          0          0
Flanders  1850  1870  0          0          1
Flanders  1871  1899  0          1          1
Flanders  1900  1945  1          1          0
Flanders  1946  1999  1          0          0
Flanders  2000  2020  1          0          1
...
Wallonia  2010  2020  1          1          1

由于我必须多次重复该操作并更改要合并的数据帧数量,因此我想创建一个函数。有人可以帮我解决这个问题吗?提前致以诚挚的谢意。

【问题讨论】:

  • 你需要Reduce(function(x, y) merge(x, y, all = TRUE), list(Variable1.df, Variable2.df, Variable3.df))吗?
  • 非常感谢您的帮助。这也朝着正确的方向发展,但是当我运行代码时,输​​出也与我寻求的不对应(见上文):有多个 Flanders 1830-xxxx 并且行不匹配(对于每一行,两个变量包含 NA。

标签: r dataframe merge chronological


【解决方案1】:

也许你正在寻找这个:

library(dplyr)
#Extract data into a list
v1 <- ls(pattern = '\\.df')
#Store in a list
List <- mget(v1)
#Merge
Merged <- Reduce(function(x, y) full_join(x, y),List) %>% replace(is.na(.),0)

【讨论】:

  • 非常感谢您的帮助!这朝着正确的方向发展。不幸的是,当我用我的 mwe 运行代码时,我没有得到我正在寻找的输出(见上文)。数据未按案例排序,分解似乎无法正常工作:例如,我获得了不同的 Flanders 1830-xxxx。
  • @CNiessen 请试试这个代码Merged &lt;- Reduce(function(x, y) full_join(x, y),List) %&gt;% replace(is.na(.),0) %&gt;% arrange(Cases),让我知道它是否有效!
  • 非常感谢!案件现在分类正确,非常感谢。但是,对于它们中的每一个,仍有多个时期需要汇总。例如。法兰德斯 1830-1899/1900-2020 和法兰德斯 1830-1870/1871-1945/1946-2020 应聚合为法兰德斯 1830-1870/1871-1899/1900-1945/1946-2020。
  • @CNiessen 我不明白你所说的聚合是什么意思? Merged &lt;- Reduce(function(x, y) full_join(x, y),List) %&gt;% replace(is.na(.),0) %&gt;% arrange(Cases,From,To)
  • 通过聚合,我的意思是我不希望同一案例的同一时间段被包含两次。一个较短的示例(与我的 mwe 不同的句点使其更明显):如果我有两行 Flanders 1830-1840 和 Flanders 1830-1850,它们应该成为 Flanders 1830-1840 和 Flanders 1841-1850。
【解决方案2】:

我们可以使用tidyverse 方法

library(dplyr)
library(purrr)
library(tidyr)
mget(ls(pattern = "\\.df")) %>%
    reduce(full_join) %>% 
    mutate(across(everything(), replace_na, 0))

【讨论】:

  • 非常感谢您的帮助!不幸的是,产生的结果与@Duck 的第一个建议相同。当我用我的 mwe 运行代码时,我没有得到我正在寻找的输出(见上文)。数据未按案例排序,分解似乎无法正常工作:例如,我获得了不同的 Flanders 1830-xxxx。
猜你喜欢
  • 2022-11-02
  • 2015-03-16
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多