【问题标题】:replacing values in a column with another column R用另一列 R 替换列中的值
【发布时间】:2015-11-21 06:11:11
【问题描述】:

我有两个不同维度的表,现在我想根据用户 ID 将值 datA$swl1 替换为 datB$swl2 中的值。

数据

 id swl1
 1   0.8
 2   0.7
 3   0.4
 4   0.7
 5   0.0

数据B

id   swl2
 1   0.8
 3   0.6
 5   0.7

输出

datA(这里swl1被swl2中的新值代替,但并不是所有的id都有新值,没有的则保留原来的值)

 id swl1
 1   0.8
 2   0.7
 3   0.6
 4   0.7
 5   0.7

如何做到这一点?

【问题讨论】:

  • datB 中的第二列叫什么?

标签: r replace multiple-columns


【解决方案1】:

您可以使用merge 匹配id,然后在swl1 列中替换datB 中存在的那些项目:

datC <- merge(datA, datB, all.x=TRUE)
datC
##   id swl1 swl2
## 1  1  0.8  0.8
## 2  2  0.7   NA
## 3  3  0.4  0.6
## 4  4  0.7   NA
## 5  5  0.0  0.7

这匹配了行。现在将swl1 列中的这些值替换为swl2 列中的非NA 值:

datC$swl1 <- ifelse(is.na(datC$swl2), datC$swl1, datC$swl2)
datC$swl2 <- NULL
datC
##   id swl1
## 1  1  0.8
## 2  2  0.7
## 3  3  0.6
## 4  4  0.7
## 5  5  0.7

【讨论】:

    【解决方案2】:

    如果你想选择最大值,不管它在哪一列,你都可以试试

    library(dplyr)
    datA <- data.frame(id=c(1,2,3,4,5), swl1=c(0.8, 0.7, 0.4, 0.7, 0.0))
    datB <- data.frame(id=c(1,3,5), somename=c(0.8, 0.6, 0.7))
    
    datC <- full_join(datA, datB)
    datA <- data.frame(id=c(1:5))    
    datA$swli1 <- apply(datC[, c('swl1', 'somename')], 1, function(x) max(na.omit(x)))
    
    > datA
      id swli1
    1  1   0.8
    2  2   0.7
    3  3   0.6
    4  4   0.7
    5  5   0.7
    

    【讨论】:

    • 这类事情的有用代码:datA &lt;- read.table(header=TRUE, file='clipboard')
    • 但是答案不是一个独立的解决方案
    • 您可以通过dput 提供数据来使其自成一体——甚至可以编辑问题并将定义放在那里。只是想为您节省一些时间。
    【解决方案3】:

    一行代码就可以得到这个结果:

    datA$swl1[datA$id %in% datB$id] <- datB$swl2
    #> datA
    #  id swl1
    #1  1  0.8
    #2  2  0.7
    #3  3  0.6
    #4  4  0.7
    #5  5  0.7
    

    使用%in% 运算符,我们选择列datA$swl1 的条目,这些条目属于与datB 中列出的具有相同id 的行。然后将datA$swl1 列中的这些值替换为datBswl2 列中的条目。

    【讨论】:

    • %in% 很有用!
    【解决方案4】:

    IIUC,使用data.table v1.9.5

    require(data.table)
    setDT(datA)[datB, swl1 := swl2, on = "id"]
    

    datA 通过引用更新。

    【讨论】:

      猜你喜欢
      • 2016-03-08
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      相关资源
      最近更新 更多