我可能在这个问题上很容易丢失一些东西。我无法在任何地方找到合适的答案 - 我真的需要继续前进。所以我过分简化了我的数据:
eventID <- c(2,4)
Time <- c("09:32","09:43")
df1 <- data.frame(eventID,Time)
eventID <- rep(c(1:4),rep(3,4))
Time <- rep(c("09:30",NA,"09:40",NA),rep(3,4))
df2 <- data.frame(eventID,Time)
我想要的是合并Time
列。因此,df2
中的NAs应填充Time
与df1
匹配的eventID
值。我的原始数据非常大,因此for
- 循环不是我真正想要的。我希望这会奏效:
> (res1 <- merge(df1,df2, by = "eventID", all = T))
# eventID Time.x Time.y
#1 1 <NA> 09:30
#2 1 <NA> 09:30
#3 1 <NA> 09:30
#4 2 09:32 <NA>
#5 2 09:32 <NA>
#6 2 09:32 <NA>
#7 3 <NA> 09:40
#8 3 <NA> 09:40
#9 3 <NA> 09:40
#10 4 09:43 <NA>
#11 4 09:43 <NA>
#12 4 09:43 <NA>
期望的输出:
> eventID <- rep(c(1:4),rep(3,4))
> Time <- rep(c("09:30","09:32","09:40","09:43"), rep(3,4))
> (res2 <- data.frame(eventID,Time))
# eventID Time
#1 1 09:30
#2 1 09:30
#3 1 09:30
#4 2 09:32
#5 2 09:32
#6 2 09:32
#7 3 09:40
#8 3 09:40
#9 3 09:40
#10 4 09:43
#11 4 09:43
#12 4 09:43
连连呢?如果可能,请base
我愿意,或者data.table
包。
答案 0 :(得分:4)
尝试
library(data.table)
setkey(setDT(df2), eventID)[df1, Time:= i.Time][]
# eventID Time
#1: 1 09:30
#2: 1 09:30
#3: 1 09:30
#4: 2 09:32
#5: 2 09:32
#6: 2 09:32
#7: 3 09:40
#8: 3 09:40
#9: 3 09:40
#10: 4 09:43
#11: 4 09:43
#12: 4 09:43
base R
之后的merge
选项
data.frame(eventID= res1[,1],
Time=res1[-1][cbind(1:nrow(res1),max.col(!is.na(res1[-1])))])
假设有一些&#39; eventID&#39;在第一个数据集中不在第二个数据集中(&#39; df2&#39;),那么我们可以指定nomatch=0
df3 <- data.frame(eventID= c(2,4,5), Time=c('09:32', '09:43', '09:45'))
setkey(setDT(df2), eventID)[df3, Time:= i.Time,nomatch=0][]
# eventID Time
# 1: 1 09:30
# 2: 1 09:30
# 3: 1 09:30
# 4: 2 09:32
# 5: 2 09:32
# 6: 2 09:32
# 7: 3 09:40
# 8: 3 09:40
# 9: 3 09:40
#10: 4 09:43
#11: 4 09:43
#12: 4 09:43