【问题标题】:dynamically assign number of splits in data.table tstrsplit在 data.table tstrsplit 中动态分配分割数
【发布时间】:2015-10-18 16:15:28
【问题描述】:

data.table v.1.9.6 中,您可以像这样将变量拆分为列:

library(data.table)
DT = data.table(x=c("A/B", "A", "B"), y=1:3)
DT[, c("c1", "c2") := tstrsplit(x, "/", fixed=TRUE)][]

所需的拆分数量 [以上:2] 并不总是事先知道的。 已知拆分次数时如何生成所需的变量名称?

n = 2  # desired number of splits
# naive attempt to build required string
m = paste0("'", "myvar", 1:n, "'", collapse = ",")
m = paste0("c(", m, ")" )

# [1] "c('myvar1','myvar2','myvar3')"


DT[, m := tstrsplit(x, "/", fixed=TRUE)][]  # doesn't work

【问题讨论】:

    标签: r split data.table


    【解决方案1】:

    两种方法。强烈建议第一个:

    #one
    n=2
    DT[, paste0("myvar", 1:n) := tstrsplit(x, "/", fixed=T)][]
    #     x y myvar1 myvar2
    #1: A/B 1      A      B
    #2:   A 2      A     NA
    #3:   B 3      B     NA
    
    #two
    DT[, eval(parse(text=m)) := tstrsplit(x, "/", fixed=TRUE)][]
    #     x y myvar1 myvar2
    #1: A/B 1      A      B
    #2:   A 2      A     NA
    #3:   B 3      B     NA 
    

    额外的

    如果您事先不知道拆分数量:

    splits <- max(lengths(strsplit(DT$x, "/")))
    DT[, paste0("myvar", 1:splits) := tstrsplit(x, "/", fixed=T)][]
    

    【讨论】:

    • 如果您指定更多拆分,那么它可能会被回收。他们的问题可能有错字:"How can I generate the required variable names when the number of splits is known?"。也许他们的意思是写“未知”。
    • 他们的意思是已知的。已编辑问题以通过设置 n = 2 使其 [希望] 清除。
    • 那么上面的答案就可以了。
    【解决方案2】:

    另一种简单的方法。您可以将拆分的字符串堆叠在单个列中,而不是制作额外的列:

    DT = data.table(x=c("A/B", "A", "B"), y=1:3)
    
    DT1 <- DT[, .(new=tstrsplit(x, "/",fixed=T)), by=y]
    DT1
    
    #    y new
    # 1: 1   A
    # 2: 1   B
    # 3: 2   A
    # 4: 3   B
    

    【讨论】:

      猜你喜欢
      • 2021-10-23
      • 2020-04-13
      • 2023-02-03
      • 1970-01-01
      • 2010-12-04
      • 2015-07-14
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多