微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

data.table 链接不会创建新变量

如何解决data.table 链接不会创建新变量

在此示例中,我无法进行链接工作。有人可以解释我遗漏了什么吗?

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)",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

解决方法

过滤并关闭括号后,就地分配将被破坏。也就是说,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",c("v3","v4") := .(sub("nr.",V2),sub("\\D*(\\d)",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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。