合并数据框架与重复观察

时间:2016-05-13 14:09:08

标签: r merge dplyr

我有两个数据框:

df1 <- data.frame(index = c(rep(2,5), rep(3,8), rep(4,6), rep(5,9)),
              start = c(0:4, 0:7, 0:5, 0:8),
              end = c(1:5, 1:8, 1:6, 1:9),
              v1= rep(1,28))


df2 <- data.frame(index = c(rep(2,5), rep(3,7), rep(4,6), rep(5,6)),
              v1 = rnorm(24))

假设index列代表一个人的不同观察结果。 在df1中的这个示例中,我们有一个id为2和5的观察者, 身份3的人有8个观察,依此类推。

我现在想要将v1df1的值替换为v1df2的值。 df2有时观察的次数少于df1,例如对于第3和第5人。

合并的方式应该是第一次观察时采用df2的v1,如果没有更多观察结果,那么NA应该被替换。

应保留df1帧的结构,但v1应替换为df2的结构。

1 个答案:

答案 0 :(得分:2)

要通过联接执行此操作,您需要一个组内索引,以便您拥有匹配的唯一标识符。

如果df2已经按正确的顺序创建,那么这很简单,因此加入后的任何NA值都应该在每个组的末尾。您可以将end变量添加到df2,并将加入indexend

我还会从第一个数据集v1中删除df1

library(dplyr)
df2 %>%
    group_by(index) %>%
    mutate(end = 1:n()) %>%
    left_join(select(df1, -v1), .)

   index start end          v1
1      2     0   1 -1.57254316
2      2     1   2 -1.09000063
3      2     2   3 -0.13775401
4      2     3   4 -0.94088741
5      2     4   5  0.45180766
6      3     0   1  2.14925746
7      3     1   2  1.79103360
8      3     2   3 -0.28344963
9      3     3   4 -0.10250375
10     3     4   5  0.21321949
11     3     5   6  0.07982287
12     3     6   7  0.37987963
13     3     7   8          NA
14     4     0   1  0.41360521
15     4     1   2 -0.28888575
16     4     2   3 -0.58786830
17     4     3   4  0.14340062
18     4     4   5  1.46434162
19     4     5   6  1.73668914
20     5     0   1  1.43112233
21     5     1   2  0.40772442
22     5     2   3 -1.77085141
23     5     3   4 -0.94653948
24     5     4   5 -1.54412791
25     5     5   6 -0.28174510
26     5     6   7          NA
27     5     7   8          NA
28     5     8   9          NA

正如@SteveBeaupre的评论中指出的那样,你可以用1:n()替换row_number()的旧习惯。