【问题标题】:Specific value subset replacement between two tables in rr中两个表之间的特定值子集替换
【发布时间】:2019-11-28 06:42:02
【问题描述】:

我想将b列表1中的某个值替换为b列表2中的值 IF a列表1中的值等于a列表2中的值.

我试过这个,但它给了我一个关于替换长度问题的错误

table1$b[is.na(match(table1$a, 
table2$a))] <- 
as.character(table2$b[match(table1$a, 
table2$a)])

这是我正在处理的数据示例:

table1 <- data.frame (a = 
c("OP2775iia","OP2775iib","OP2958i_a","OP2958i_b","OP2958iia"),
                   b = c(COM,NA,NA,NA,COM))


table2 <- data.frame (a = c("OP2775iib","OP2958i_b"),
                      b = c(SAV,PAV))

我想要一个输出,其中 table1 条目 'OP2775iib' 和 'OP2958i_b' 的 b 列值分别更改为 'SAV' 和 'PAV'。

【问题讨论】:

  • 应该像table1$b[table1$a == table2$a] &lt;- table2$b[table1$a == tabel2$a] 这样的东西,还是我错过了另一个要求?

标签: r replace subset


【解决方案1】:

这是一个使用merge的选项:

table1 <- data.frame (a = c("OP2775iia","OP2775iib","OP2958i_a","OP2958i_b","OP2958iia"),
  b = c("COM",NA,NA,NA,"COM"), stringsAsFactors = F)

table2 <- data.frame (a = c("OP2775iib","OP2958i_b"),
  b = c("SAV","PAV"), stringsAsFactors = F)

names(table2) <- c("a", "b2")


(table3 <- merge(x = table1, y = table2, all.x = TRUE))
table3$bnew <- with(table3, ifelse(!is.na(b2), b2, b))
table3

#           a    b   b2 bnew
# 1 OP2775iia  COM <NA>  COM
# 2 OP2775iib <NA>  SAV  SAV
# 3 OP2958i_a <NA> <NA> <NA>
# 4 OP2958i_b <NA>  PAV  PAV
# 5 OP2958iia  COM <NA>  COM

【讨论】:

  • 谢谢!这非常有效......我有一个后续问题希望你能帮助我。这段代码在一个while循环中,我在那个while循环中有另一个过程,它在第3行找到最后一个剩余的NA的值(名称)。但是,随着循环的运行,“bnew”列被覆盖,我输了我们刚刚在这里包含的值.. 所以本质上我需要在 while 循环迭代时将值存储在一个表中。我尝试使用“附加”功能,但似乎无法正确使用语法。你能帮忙吗?
猜你喜欢
  • 2019-03-01
  • 2018-01-06
  • 2022-09-28
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多