我有两个数据框:
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个观察,依此类推。
我现在想要将v1
中df1
的值替换为v1
中df2
的值。 df2有时观察的次数少于df1,例如对于第3和第5人。
合并的方式应该是第一次观察时采用df2的v1,如果没有更多观察结果,那么NA
应该被替换。
应保留df1帧的结构,但v1应替换为df2的结构。
答案 0 :(得分:2)
要通过联接执行此操作,您需要一个组内索引,以便您拥有匹配的唯一标识符。
如果df2
已经按正确的顺序创建,那么这很简单,因此加入后的任何NA值都应该在每个组的末尾。您可以将end
变量添加到df2
,并将加入index
和end
。
我还会从第一个数据集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()
的旧习惯。