【问题标题】:R: Replace Values by RowR:按行替换值
【发布时间】:2021-02-04 07:52:52
【问题描述】:

我有一个如下所示的数据框:

ID1     | ID2 
I105    | I105
I122    | I122
**I107  | I108**
I118    | I118
**I139  | I140**

现在我想将 [3,2] 中的“I108”替换为 [3,1] 中的“I107”

与第 5 行中的值相同。

实际的列表有点长,所以我必须找到一种方法来自动完成。

有人有想法吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    也许您希望仅在 ID1ID2 不同时替换 ID1 值。

    transform(df, ID1 = ifelse(ID1 != ID2, ID2, ID1))
    
    #   ID1  ID2
    #1 I105 I105
    #2 I122 I122
    #3 I108 I108
    #4 I118 I118
    #5 I140 I140
    

    【讨论】:

    • 是的,这就是我想要的。但是您的代码似乎无法正常工作。当我运行代码时,第一列转换为:c(1, 4, 2, 3, 5)
    • @Proki 你有数据作为因素或列表吗?运行df[] <- lapply(df, as.character),然后重试。
    • 非常感谢!但是我可以问另一个与此相关的问题:在 ID1 中的一行是 na 的情况下如何转换代码。然后它应该只循环这一行
    • 您可以使用is.na 来检查NA 的值。像这样的东西:transform(df, ID1 = ifelse(ID1 != ID2 | is.na(ID1), ID2, ID1))
    【解决方案2】:

    我们可以使用索引将“ID2”的值替换为“ID1”中的对应值

    i1 <- c(3, 5)
    df1 <- type.convert(df1, as.is = TRUE) # // in case if there are factor columns
    # or if it is based on difference
    i1 <- with(df1, ID2 != ID1)
    df1$ID2[i1] <- df1$ID1[i1]
    

    -输出

    df1
    #.  ID1  ID2
    #1 I105 I105
    #2 I122 I122
    #3 I108 I108
    #4 I118 I118
    #5 I140 I140
    

    如果我们想创建 ID1 的副本,只需执行分配即可。不需要任何条件

    df1$ID2 <- df1$ID1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2020-07-03
      • 2012-08-22
      • 1970-01-01
      相关资源
      最近更新 更多