gpt4 book ai didi

R:如何合并两个数据框以获得面板数据?

转载 作者:行者123 更新时间:2023-12-05 02:59:03 24 4
gpt4 key购买 nike

我有两个数据框,其中包含一些带有两列 ID 的调查数据。一个数据框有一年的数据,另一个有另一年的数据。一个数据框有一个变量,另一个没有。这是这两个数据框的示例:

df1 <- data.frame(id1 = c(1, 1, 2, 2, 3, 3), 
id2 = c(1, 2, 1, 2, 1, 2),
name = c("foo1", "foo2", "foo3", "foo4", "foo5", "foo6"),
variable = c(100, 110, 120, 130, 140, 150),
year = rep(2019, 6))

df2 <- data.frame(id1 = c(1, 1, 2, 2, 3, 3),
id2 = c(1, 2, 1, 2, 1, 2),
variable = c(200, 210, 220, 230, 240, 250),
year = rep(2020, 6))

我想要一个独特的 df,其中包含每个人的两个观察结果:2019 年的观察结果和 2020 年的观察结果。这是我尝试过的:

total <- bind_rows(df1, df2)
total <- total[order(total$id1, total$id2, total$year), ]
total <- total[c(1, 2, 3, 5, 4)]

和我获得的df:

 id1 id2 name year variable
1 1 1 foo1 2019 100
7 1 1 <NA> 2020 200
2 1 2 foo2 2019 110
8 1 2 <NA> 2020 210
3 2 1 foo3 2019 120
9 2 1 <NA> 2020 220
4 2 2 foo4 2019 130
10 2 2 <NA> 2020 230
5 3 1 foo5 2019 140
11 3 1 <NA> 2020 240
6 3 2 foo6 2019 150
12 3 2 <NA> 2020 250

这里有两个问题:第一个是 name 的 50% 的单元格中有一个 NA 而我希望这些名称是重复的;第二个问题是它需要 3 个步骤(如果我想复制名称,则需要更多步骤)。

有没有一个功能可以按照我想要的方式自动合并两个df?我更喜欢包含在 tidyr 包中的函数,但可以接受任何其他解决方案。

我知道有很多关于合并两个数据框的问题,但到目前为止,我没有找到我想要的,也找不到用于那个的 tidyr 函数。

编辑:预期输出:

 id1 id2 name year variable
1 1 1 foo1 2019 100
7 1 1 foo1 2020 200
2 1 2 foo2 2019 110
8 1 2 foo2 2020 210
3 2 1 foo3 2019 120
9 2 1 foo3 2020 220
4 2 2 foo4 2019 130
10 2 2 foo4 2020 230
5 3 1 foo5 2019 140
11 3 1 foo5 2020 240
6 3 2 foo6 2019 150
12 3 2 foo6 2020 250

最佳答案

library(dplyr)
library(tidyr)
bind_rows(df1, df2) %>% group_by(id1, id2) %>%
fill(name, .direction = 'down') %>%
arrange(id1, id2, year)

id1 id2 name variable year
1 1 1 foo1 100 2019
2 1 1 foo1 200 2020
3 1 2 foo2 110 2019
4 1 2 foo2 210 2020
5 2 1 foo3 120 2019
6 2 1 foo3 220 2020
7 2 2 foo4 130 2019
8 2 2 foo4 230 2020
9 3 1 foo5 140 2019
10 3 1 foo5 240 2020
11 3 2 foo6 150 2019
12 3 2 foo6 250 2020

要在不指定列名的情况下填充缺失的列,我们可以这样做

bind_rows(df1, df2) %>% group_by(id1, id2) %>% 
arrange(id1, id2, year) %>% ungroup() %>%
fill(select_if(.,~any(is.na(.))) %>% names() ,.direction = 'down')

稳健的解决方案:

#tidyr v1.0.0
full_join(df1, df2, by=c('id1', 'id2'), suffix=c('.df1', '.df2')) %>%
pivot_longer(cols=matches('.df[12]$'), names_to = c(".value","Ind"), names_sep = "\\.")

关于R:如何合并两个数据框以获得面板数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58329267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com