代码之家  ›  专栏  ›  技术社区  ›  Tyler Rinker DaniM

数据当只有一行时,表将列表添加为列

  •  3
  • Tyler Rinker DaniM  · 技术社区  · 11 年前

    我有一个功能,可以使用 数据表 其将向量列表分配为列。除非有数据,否则这很有效。表是一行。我在下面演示了这个问题。我如何制作数据。表将一个向量的列表分配为一列,方式与我将其分配为一个列的2个向量列表相同?

    微波炉,微波炉

    dat2 <- dat <- data.frame(
        x = 1:2,
        y = c('dog', 'cats'), 
        stringsAsFactors = FALSE
    )
    
    library(data.table)
    setDT(dat)           # 2 row data.table
    (dat2 <- dat2[1, ])  # single row data.frame
    setDT(dat2)
    
    letterfy <- function(x) strsplit(x, "") 
    
    ## works as expected when >= 2 rows
    dat[, letters := letterfy(y)]
    dat
    
    ##    x    y letters
    ## 1: 1  dog   d,o,g
    ## 2: 2 cats c,a,t,s
    
    ## Try on 1 row
    dat2[, letters := letterfy(y)]
    
    #Warning message:
    #In `[.data.table`(dat2, , `:=`(letters, letterfy(y))) :
    #  Supplied 3 items to be assigned to 1 items of column 'letters' (2 unused)
    
    #   x   y letters
    #1: 1 dog       d
    

    数据2的期望输出

    ##    x    y letters
    ## 1: 1  dog   d,o,g
    
    1 回复  |  直到 11 年前
        1
  •  5
  •   MichaelChirico    10 年前

    只需将输出包装在 list :

    > dat2[, letters := list(letterfy(y))][ ]
       x   y letters
    1: 1 dog   d,o,g
    

    请注意 dat[ , class(letters)] 是 列表 ; 因为列表通常在 := 对于多个作业,似乎 data.table 有点困惑。我想开发人员有理由取消在这里的分配……但这种方法也适用于有多行的情况,即。, dat[ , letters := list(letterfy(y))] 也如预期的那样工作。

    另一个选项是将字母列指定为 character 改变矢量 letterfy :

    letterfy2 <- function(x) lapply(strsplit(x, ""), paste0, collapse = ",")
    > dat[ , letters := letterfy2(y)][ ]
       x    y letters
    1: 1  dog   d,o,g
    2: 2 cats c,a,t,s
    dat2[, letters := letterfy2(y)][ ]
       x   y letters
    1: 1 dog   d,o,g