【问题标题】:Transform a set of columns in a data.table转换 data.table 中的一组列
【发布时间】:2012-11-17 09:09:20
【问题描述】:

data.table 新手问题。 我想通过对它们应用数学公式来转换 data.table 中的一组列。列集必须排除总列数的 1 个或多个。

data.frame 条件下我会这样做:

data(iris)
head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

iris[, -5] <- iris[, -5] * 1e3
head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1         5100        3500         1400         200  setosa
2         4900        3000         1400         200  setosa
3         4700        3200         1300         200  setosa
4         4600        3100         1500         200  setosa
5         5000        3600         1400         200  setosa
6         5400        3900         1700         400  setosa

我知道如何在data.table 中选择multiple columns

iris.dt <- data.table(iris)
head(iris.dt[, -5, with = FALSE])

甚至:

head(iris.dt[, !"Species", with = FALSE])

如何利用data.table pass-by-reference 实际转换这些选定的列?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    .SDcols 是正确的方法,但您可以使用向量仅指定一次列名。

    DT <- data.table(iris)
    colnms <- c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")
    DT[, (colnms) := lapply(.SD, function(x) x*1000), .SDcols = colnms]
    

    请注意,您需要 := 左侧的括号来阻止 data.tablecolnms 解释为列名。

    【讨论】:

      【解决方案2】:

      如何使用 .SDCols 参数和引用赋值 (:=):

      DT <- data.table(iris)
      DT[, c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")
         :=lapply(.SD, function(x) x*1000), .SDcols=1:4]
      # Alternatively you can grab the names the usual way:
      # DT[, names(DT)[1:4] := lapply(.SD, function(x) x*1000), .SDcols=1:4]
      DT
      #      Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
      #   1:         5100        3500         1400         200    setosa
      #   2:         4900        3000         1400         200    setosa
      #   3:         4700        3200         1300         200    setosa
      #   4:         4600        3100         1500         200    setosa
      #   5:         5000        3600         1400         200    setosa
      #  ---                                                            
      # 146:         6700        3000         5200        2300 virginica
      # 147:         6300        2500         5000        1900 virginica
      # 148:         6500        3000         5200        2000 virginica
      # 149:         6200        3400         5400        2300 virginica
      # 150:         5900        3000         5100        1800 virginica
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-10
        • 1970-01-01
        • 2016-01-01
        • 2012-08-16
        • 2012-01-12
        • 2020-11-15
        • 2018-02-15
        相关资源
        最近更新 更多