【问题标题】:R conditional replacement data frame valuesR 条件替换数据帧值
【发布时间】:2024-01-23 16:26:01
【问题描述】:

我想用对一个或多个其他列 (df$b, df$c) 的数学运算结果更新数据框列 (df$d),条件是另一列 (df$a) 的值.

set.seed(55)
df <- data.frame(a = rnorm(10), b = rnorm(10), c = rnorm(10), d = 0)
df$d[df$a > 0] <- df$b[df$a > 0] / df$c[df$a > 0]

第三行生成 df$d 的预期值。有没有办法更简洁地写这个?我对不需要我重复逻辑索引的选项特别感兴趣。

例如,这种风格的表达式在 Python/Pandas 中有效,并且只需要赋值运算符左侧的一个 '[df$a > 0]' 实例:

df$d[df$a > 0] <- df$b / df$c

感谢您的任何建议。

【问题讨论】:

    标签: r indexing dataframe


    【解决方案1】:

    改用data.table,你的生活会好很多:

    library(data.table)
    dt = data.table(df) # or construct it same way: dt = data.table(a = rnorm(10),...)
    
    dt[a > 0, d := b/c]
    

    【讨论】:

      【解决方案2】:

      试试这个:

      transform(df, d = ifelse(a > 0, b/c, d))
      

      【讨论】:

        【解决方案3】:
        transform(df, d = b / c * (a > 0))
        

        会成功的。此解决方案取决于d 列的存在。因此,您不需要用零初始化列。

        【讨论】: