在 data.table 中更新一列两次在 R 中有效

update one column twice in a data.table efficient in R

我有一个数据 table 看起来像这样:

DT <- data.table(Zeit = c(0.024, 0.4, 0.05),
                 Gier = c(1, 2, 3),
                 GierVZ = c(1, 0, 1),
                 Quer = c(2, 4, 6))

现在我想更新并向该数据添加一些列 table。但是我无法更新 Gier 两次,因为它会创建重复项并出现错误。

DT[, ':='(Zeit   = round(Zeit, digits = 2),
          Gier   = replace(Gier, Gier == 163.83, NA),
          GierVZ = factor(GierVZ, levels = c(0, 1), labels = c("positiv", "negativ")),
          Quer   = Quer * 9.81,
          Gier   = ifelse(GierVZ == "negativ", Gier * -1, Gier))]

一般情况下如何避免这种情况并仍然创建一些可读的快速代码? 我相信对此有一个简单的答案。但我是数据 tables 的新手,我认为(至少目前)它不像 dplyr 那样直观,但它对我的大数据来说要快得多。

这种方法对我来说具有大致相同的可读性并实现了您的目标:

DT[ , `:=`(
  Zeit = round(Zeit, digits=2L),
  GierVZ = factor(GierVZ, levels = c(0, 1), labels = c("positiv", "negativ")),
  Quer   = Quer * 9.81
)]
DT[Gier == 163.83, Gier := NA]
DT[ , Gier := fifelse(GierVZ == "negativ", Gier * -1, Gier))]

或者,在 data.table (Installation instructions) 的开发版本中,您可以受益于 fcase:

DT[ , `:=`(
  Zeit   = round(Zeit, digits=2L),
  GierVZ = factor(GierVZ, levels = c(0, 1), labels = c("positiv", "negativ")),
  Quer   = Quer * 9.81
  Gier   = fcase(
      Gier == 163.83    , NA_real_, 
    GierVZ == 'negative',    -Gier, 
    GierVZ == 'positiv' ,     Gier
  )
)]

如果你能跳过写出最后的GierVZ=='positiv'条件会更容易;这是正在进行的功能请求。

您可以在花括号中计算 Gier

DT[, ':='(Zeit   = round(Zeit, digits = 2),
          Gier   = {Gier[Gier == 163.83] <- NA; ifelse(GierVZ, -Gier, Gier)},
          GierVZ = factor(GierVZ, levels = c(0, 1), labels = c("positiv", "negativ")),
          Quer   = Quer * 9.81)]