【问题标题】:Replacing column value interchangeably using a condition in R使用 R 中的条件替换列值
【发布时间】:2021-10-25 22:58:26
【问题描述】:

在下面编码的 R 数据框中,如果“Dupl”列有 8 个行,我想将“Amount1”列与“Amount2”列值互换。

  • 输入数据帧
dt <- data.table(ID=c("A","A","B","B"),Amount1=c(100,200,300,400), Amount2=c(1500,1500,2400,2400),Dupl=c(1,8,1,0))

现在由于“Dupl”列有 8 个是第二行,所以我想在第二行将“Amount1”更改为“Amount2”。

  • 期望的输出
dt <- data.table(ID=c("A","A","B","B"),Amount1=c(100,1500,300,400), Amount2=c(1500,200,2400,2400),Dupl=c(1,8,1,0))

有什么建议吗?

【问题讨论】:

    标签: r dataframe data.table tidyverse


    【解决方案1】:

    base R中,这可以通过行列索引来完成,即使用行的逻辑条件,并反转&lt;-lhsrhs中的列名

    dt[Dupl == 8, c("Amount1", "Amount2")] <- dt[Dupl == 8, c("Amount2", "Amount1")]
    

    注意:Dupl == 8 仅在对象为 data.table 时有效。如果是单独的data.frame,则使用dt$Dupl == 8

    -输出

    > dt
       ID Amount1 Amount2 Dupl
    1:  A     100    1500    1
    2:  A    1500     200    8
    3:  B     300    2400    1
    4:  B     400    2400    0
    

    或者data.table中的相同方法,即用逻辑条件指定i,以相反的顺序指定.SDcols,以正确的顺序分配(:=)data.table的子集(.SD

    dt[Dupl == 8, c("Amount1", "Amount2") := .SD, .SDcols = c("Amount2", "Amount1")]
    

    【讨论】:

    • 谢谢你,亲爱的,它正在工作。在实际数据中遇到了一些问题,但从这里解决了这个问题。 community.rstudio.com/t/…
    【解决方案2】:

    akrun's second approach 可以进一步精简

    cols <- c("Amount1", "Amount2")
    dt[Dupl == 8, (cols) := .SD, .SDcols = rev(cols)][]
    

    或者,或者,

    cols <- c("Amount1", "Amount2")
    dt[Dupl == 8, rev(cols) := .SD, .SDcols = cols][]
    

    都返回

       ID Amount1 Amount2 Dupl
    1:  A     100    1500    1
    2:  A    1500     200    8
    3:  B     300    2400    1
    4:  B     400    2400    0
    

    或者,避免使用.SDcols 参数:

    dt[Dupl == 8, `:=`(Amount1 = Amount2, Amount2 = Amount1)][]
    

    我也尝试过使用fifelse() 的方法,但这些方法非常冗长,因为fifelse() 只能处理向量值,例如,

    dt[, c("Amount1", "Amount2") := .(fifelse(Dupl == 8, Amount2, Amount1), 
                                      fifelse(Dupl == 8, Amount1, Amount2))][]
    

    dt[, `:=`(Amount1 = fifelse(Dupl == 8, Amount2, Amount1), 
              Amount2 = fifelse(Dupl == 8, Amount1, Amount2))][]
    

    【讨论】:

    • @gupta,非常感谢您的友好回复!
    • @gupta,不幸的是,您的所有赞成票都被 SO 删除了 :-( 我被告知“当单个用户在短时间内对您的许多帖子持续投票(赞成或反对)时,系统认为这些投票无效并将其删除。”
    • 是的,亲爱的,我收到了同样的信息,我认为版主阅读了每条信息,因为警告是在将近 1 小时后发出的。我会牢记这一点,并尝试定期访问您的帐户以进行学习。谢谢
    猜你喜欢
    • 2012-12-02
    • 2011-06-09
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    相关资源
    最近更新 更多