【问题标题】:replace row values based on another row value in a data.table根据 data.table 中的另一个行值替换行值
【发布时间】:2020-03-19 16:40:37
【问题描述】:

我有一个琐碎的问题,虽然我很难找到一个简单的答案。我有一个看起来像这样的数据表:

dt <- data.table(id= c(A,A,A,A,B,B,B,C,C,C), time=c(1,2,3,1,2,3,1,2,3), score = c(10,15,13,25,NA,NA,18,29,19))
dt
#     id  time  score
# 1:   A    1    NA
# 2:   A    2    10
# 3:   A    3    15
# 4:   A    4    13
# 5:   B    1    NA
# 6:   B    2    25
# 7:   B    3    NA
# 8:   B    4    NA
# 9:   C    1    18
# 10:  C    2    29
# 11:  C    3    NA
# 12:  C    4    19

我想用“A”的值替换我的组“B”的缺失值。

最终的数据集应该是这样的

final
#     id  time  score
# 1:   A    1    NA
# 2:   A    2    10
# 3:   A    3    15
# 4:   A    4    13
# 5:   B    1    NA
# 6:   B    2    25
# 7:   B    3    15
# 8:   B    4    13
# 9:   C    1    18
# 10:  C    2    29
# 11:  C    3    NA
# 12:  C    4    19

换句话说,以B为NA为条件,我想替换“A”的分数。请注意,“C”仍然是 NA。 我正在努力寻找一种干净的方法来使用 data.table 做到这一点。但是,如果使用其他方法更简单,它仍然可以。

非常感谢您的帮助

【问题讨论】:

  • 您的可重现数据是一团糟(不可重现)。请修复。

标签: r data.table data-manipulation


【解决方案1】:

这里有一个选项,我们可以得到'score'为NA的行的索引,'id'是“B”,用它来用'A'中相应的'score'值替换NA '

library(data.table)
i1 <- setDT(dt)[id == 'B', which(is.na(score))]
dt[, score:= replace(score, id == 'B' & is.na(score), score[which(id == 'A')[i1]])]

dplyr中的类似选项

library(dplyr)
dt %>%
   mutate(score = replace(score, id == "B" & is.na(score), 
         score[which(id == "A")[i1]))

【讨论】:

  • 非常感谢 Akrun,您还可以建议使用 dplyr 的解决方案吗?
  • @Alex 您也可以使用与dplyr 相同的方法,已更新
猜你喜欢
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2023-04-09
相关资源
最近更新 更多