我有两个数据框,包含一些调查数据,其中有两列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))
我希望得到一个包含每个人两个观察值的独特数据框:2019年的观察值和2020年的观察值。这是我尝试过的代码:
total <- bind_rows(df1, df2)
total <- total[order(total$id1, total$id2, total$year), ]
total <- total[c(1, 2, 3, 5, 4)]
而且我得到的数据框是:
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步(如果我想要重复名称,则需要更多步骤)。是否有一种函数可以自动按照我想要的方式合并这两个数据框?我希望使用
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
result$name
重复了序列foo1...foo6
两次,而我想要将带有foo1
的行放在一起,等等。 - bretauvmerge 1:1 ... using...
),所以我点了赞,但不要把你的答案作为解决方案。 - bretauv