gpt4 book ai didi

r - 在 R 中组合/合并列

转载 作者:行者123 更新时间:2023-12-01 12:36:14 27 4
gpt4 key购买 nike

我可能遗漏了一些很容易解决这个问题的东西。我无法在任何地方找到正确的答案 - 我真的需要继续前进。所以我过度简化了我的数据:

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 中的 NA 应该用 df1 中匹配 eventIDTime 值填充。我的原始数据非常大,所以 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 包中。

最佳答案

尝试

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

或者 merge 之后的 base R 选项将是

 data.frame(eventID= res1[,1], 
Time=res1[-1][cbind(1:nrow(res1),max.col(!is.na(res1[-1])))])

更新

假设第一个数据集中有一些'eventID'不在第二个数据集中('df2'),那么我们可以指定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

关于r - 在 R 中组合/合并列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29565464/

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