【问题标题】:full join of the several data frames of nested data frame嵌套数据框的几个数据框的全连接
【发布时间】:2020-12-29 06:49:18
【问题描述】:

我在使用 map 函数后创建了一个嵌套数据框(如下所示),但我尚未对其进行测试。考虑下面的示例,假设我在另一个数据框中嵌套了 4 个数据框(基于年份)。也就是说,我手中的数据框看起来像df_nested。 我如何分别完全加入每年的数据帧(再次使用地图),然后将它们取消嵌套到最终数据集中?我正在尝试完全加入 2010 年的数据帧(df1, df2) 相互连接,然后将 2011 年的数据帧 (df3, df4) 完全连接起来,最后附加这些完全连接的数据集。

df1 <- data.frame(year = c(2010,2010,2010,2010),id=c(1,2,3,4), name = c("A","B","C","D"))
df2 <- data.frame(year = c(2010,2010,2010,2010),id=c(1,2,3,4), age=c(21,22,25,29))
df3 <- data.frame(year = c(2011,2011,2011,2011),id=c(5,6,7,8), name = c("W","X","Y","Z"))
df4 <- data.frame(year = c(2011,2011,2011,2011),id=c(5,6,7,8), age=c(30,35,40,50))

df_netsed <- bind_rows(df1,df2,df3,df4) %>%
  group_by(year) %>%
  nest()

这是我希望看到的:

df_expected <- full_join(df1, df2,by="id") %>% bind_rows(full_join(df3, df4,by="id"))

【问题讨论】:

  • df_netsed 没有关于哪些数据来自df1df2 的信息。你将如何加入他们?
  • @RonakShah,我假设它们是基于年份嵌套的,我们可以将 plyr::join_all() 之类的函数映射到它们。
  • 您可以访问df1df2 数据帧吗?还是你身边只有df_netsed
  • 我可以将嵌套的数据框放在一个列表中,如果这有助于更好地甚至取消嵌套它们。

标签: r join nested


【解决方案1】:

您可以尝试 group_by id 并删除每个嵌套数据的 NA 值。

library(tidyverse)

df_netsed %>%
  ungroup %>%
  mutate(data = map(data, 
                ~.x %>% group_by(id) %>% summarise(across(.fns = na.omit)))) %>%
  unnest(data)

#   year    id name    age
#  <dbl> <dbl> <chr> <dbl>
#1  2010     1 A        21
#2  2010     2 B        22
#3  2010     3 C        25
#4  2010     4 D        29
#5  2011     5 W        30
#6  2011     6 X        35
#7  2011     7 Y        40
#8  2011     8 Z        50

【讨论】:

  • 谢谢,但是,我在这里得到的是一个附加的数据框,而不是一个联合的。
  • 您所展示的df_expected 与我在回答中所提供的到底有什么不同?
  • 我没有得到相同的结果
  • 你能具体点吗?我的回答和df_expected 有什么不同?
  • 每个 id 有两行,所以 id 是重复的。所以我每个 id 有两行。
【解决方案2】:

更新每个 OP cmets
你其实不需要嵌套,group_by 应该就够了:

library(dplyr)

bind_rows(df1, df2, df3, df4) %>%
  group_by(year, id) %>%
  summarise(across(everything(), na.omit))

# Groups:   year [2]
   year    id name    age
  <dbl> <dbl> <fct> <dbl>
1  2010     1 A        21
2  2010     2 B        22
3  2010     3 C        25
4  2010     4 D        29
5  2011     5 W        30
6  2011     6 X        35
7  2011     7 Y        40
8  2011     8 Z        50

上一页
使用dplyr,可以先加入每对数据框,再加入bind_rows

library(dplyr)

inner_join(df1, df2) %>% bind_rows(inner_join(df3, df4))

  year id name age
1 2010  1    A  21
2 2010  2    B  22
3 2010  3    C  25
4 2010  4    D  29
5 2011  5    W  30
6 2011  6    X  35
7 2011  7    Y  40
8 2011  8    Z  50

【讨论】:

  • 谢谢,@andrew_reece,但实际上,我每年都有数百个数据集,所以我必须能够为每年映射一个函数。
  • 谢谢,但是,我在这里得到的是一个附加的数据框,而不是一个联合的数据框
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2020-05-02
  • 2017-06-25
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多