【问题标题】:What is the correct syntax for this data.table task in R?R 中这个 data.table 任务的正确语法是什么?
【发布时间】:2012-09-10 17:46:51
【问题描述】:

我在R 中有以下data.table

  library(data.table)
  DT = data.table(x=rep(c("b","a","c"),each=3), y=sample(rnorm(9)), v=1:9)

我只想通过x 列计算最小值和最大值,并将这两个新列添加到DT。这是我的路线:

  DT[,c("e","d"):= list(min(y),max(y)), with=FALSE, by = x] 
  Error in `[.data.table`(DT, , `:=`(c("e", "d"), list(min(y), max(y))),  : 
  'with' must be TRUE when 'by' or 'keyby' is provided

不过,如果我写:DT[,c("e","d"):= list(min(y),max(y)), with=FALSE],我会明白:

     x       y    v     e       d
  1: a -1.7125000 4 -1.7125 1.30553
  2: a  1.0198038 5 -1.7125 1.30553
  3: a  1.3055301 6 -1.7125 1.30553
  4: b -0.9238759 1 -1.7125 1.30553
  5: b  0.3077016 2 -1.7125 1.30553
  6: b -1.2580845 3 -1.7125 1.30553
  7: c -0.9399120 7 -1.7125 1.30553
  8: c -0.1910583 8 -1.7125 1.30553
  9: c  0.1239158 9 -1.7125 1.30553

如您所见,这是有效的,但它并没有完成x 的任务。我想获得类似的东西,但ed 应该由变量x 的每个值计算。所以,我的问题是:我该如何解决这个问题?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    := by group”(1.8.2 版中的新功能)和“:= with multiple new columns”(1.7.8 版中的新功能)都是 data.table 中最近添加的内容强>。

    := by group with multiple new columns”只是还没有(还)实现。

    所以现在,您可以这样做(如果您想要单线):

    setkey(DT, "x")
    DT <- DT[DT[,list(e=min(y), d=max(y)), by=key(DT)]]
    

    或者这个(如果你想减少额外的复制操作):

    setkey(DT, "x")
    DT[,e:=min(y), by=key(DT)]
    DT[,d:=max(y), by=key(DT)]
    

    【讨论】:

    • DT[,e:=min(y), by = x][,d:=max(y), by = x] 是另一种单线解决方案。这不需要设置键
    • 这里都正确。为了完整起见,待办事项是:FR#1710FR#2120FR#1492
    【解决方案2】:

    这是语法。 DT 必须有 x 作为其工作的密钥。

    DT = data.table(x=rep(c("b","a","c"),each=3), y=sample(rnorm(9)), v=1:9)
    setkey(DT, x)
    DT[DT[, list(e=min(y), d=max(y)), by=x]]
    
       x           y v           e         d
    1: a  0.04583602 4 -0.08423764 0.5778324
    2: a  0.57783240 5 -0.08423764 0.5778324
    3: a -0.08423764 6 -0.08423764 0.5778324
    4: b -1.30934873 1 -1.30934873 0.3071819
    5: b -0.05972203 2 -1.30934873 0.3071819
    6: b  0.30718188 3 -1.30934873 0.3071819
    7: c -0.72347616 7 -0.72347616 0.7800817
    8: c -0.46930825 8 -0.72347616 0.7800817
    9: c  0.78008168 9 -0.72347616 0.7800817
    

    【讨论】:

    • 感谢您的解决方案 +1。它工作得很好。也许,我在寻找更直观的解决方案,例如非设置关键解决方案。再次感谢
    • 当然。这可能看起来不直观,但DT.1[DT.2]data.table 合并两个data.tables 的方式。不要忘记接受你得到的解决方案!
    • @Nestorghh -- 如果你真的不想使用密钥,你可以这样做:merge(DT, DT[, list(e=min(y), d=max(y)), by="x"], by="x")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2014-08-05
    相关资源
    最近更新 更多