【问题标题】:data.table chaining doesn't create the new variabledata.table 链接不会创建新变量
【发布时间】:2021-07-09 12:29:58
【问题描述】:

我无法在此示例中进行链接。有人可以解释我错过了什么吗?

library(data.table)
dt <- data.table(a=c(rep("komm", 5), rep("by", 5)), paste0("nr.",1:10))

dt[a=="komm", v3:=sub("nr.", "", V2)]
dt[, v4:=sub("\\D*(\\d)", "\\1", V2)]

# doesn't work
dt[a=="by"][
 , v5:=sub("nr.", "no.", V2)][
 , v6:=sub("\\D*(\\d)", "\\1", V2)]

我期待得到这个输出

      a    V2   v3 v4    v5   v6
1: komm  nr.1    1  1  <NA> <NA> 
2: komm  nr.2    2  2  <NA> <NA> 
3: komm  nr.3    3  3  <NA> <NA> 
4: komm  nr.4    4  4  <NA> <NA>
5: komm  nr.5    5  5  <NA> <NA> 
6:   by  nr.6 <NA>  6  no.6   6
7:   by  nr.7 <NA>  7  no.7   7
8:   by  nr.8 <NA>  8  no.8   8
9:   by  nr.9 <NA>  9  no.9   9
10:  by nr.10 <NA> 10 no.10  10

【问题讨论】:

  • 为什么你有a=="komm",而v5却变成了a=="by"
  • 我期待那个子集,即。 a=="by" 与第二次运行将创建 v5v6 加起来 dt
  • 查看?":="中的注意部分@
  • 或者应该只是?:=

标签: r data.table chaining


【解决方案1】:

过滤并关闭括号后,就地分配将被破坏。即DT[cond,newvar:=1]基于条件赋值,相当于DT[,newvar:=fifelse(cond,1,newvar)]或类似的。但是,DT[cond,] 正在返回一个新框架,现在对其进行的任何工作都与原始的 DT 完全分开。

条件赋值两次

dt <- data.table(a=c(rep("komm", 5), rep("by", 5)), paste0("nr.",1:10))
dt[a=="by", v3 := sub("nr.", "", V2)][a=="by", v4:=sub("\\D*(\\d)", "\\1", V2)]
#          a     V2     v3     v4
#     <char> <char> <char> <char>
#  1:   komm   nr.1   <NA>   <NA>
#  2:   komm   nr.2   <NA>   <NA>
#  3:   komm   nr.3   <NA>   <NA>
#  4:   komm   nr.4   <NA>   <NA>
#  5:   komm   nr.5   <NA>   <NA>
#  6:     by   nr.6      6      6
#  7:     by   nr.7      7      7
#  8:     by   nr.8      8      8
#  9:     by   nr.9      9      9
# 10:     by  nr.10     10     10

...或一次多重赋值:

dt <- data.table(a=c(rep("komm", 5), rep("by", 5)), paste0("nr.",1:10))
dt[a=="by", c("v3", "v4") := .(sub("nr.", "", V2), sub("\\D*(\\d)", "\\1", V2))]
#          a     V2     v3     v4
#     <char> <char> <char> <char>
#  1:   komm   nr.1   <NA>   <NA>
#  2:   komm   nr.2   <NA>   <NA>
#  3:   komm   nr.3   <NA>   <NA>
#  4:   komm   nr.4   <NA>   <NA>
#  5:   komm   nr.5   <NA>   <NA>
#  6:     by   nr.6      6      6
#  7:     by   nr.7      7      7
#  8:     by   nr.8      8      8
#  9:     by   nr.9      9      9
# 10:     by  nr.10     10     10

【讨论】:

  • 我刚刚更正了这个例子。谢谢指出
  • 我已经追完了你的新专栏,我认为你的问题的前提(与条件赋值链接)在这里得到了回答。如果该方法不适用于您的其他列,请告诉我。
  • 感谢您的澄清,在我尝试编辑我的示例时不知道您回答了:-(
猜你喜欢
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 2019-04-29
  • 2021-12-13
  • 1970-01-01
相关资源
最近更新 更多