【问题标题】:data.table add list as column when only one rowdata.table 只有一行时将列表添加为列
【发布时间】:2015-11-10 07:42:28
【问题描述】:

我有使用 data.table 对单词进行操作的函数,该函数将向量列表分配为一列。这很好用,除非 data.table 是一行。我在下面演示这个问题。如何让 data.table 将一个向量的列表分配为一列,就像我将 2 个向量的列表作为一列一样?

MWE

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

dat2 的所需输出

##    x    y letters
## 1: 1  dog   d,o,g

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    只需将输出包装在list

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

    注意dat[ , class(letters)]list;因为通常列表在:= 的RHS 上传递多个分配,所以data.table 似乎有点困惑。我想开发人员有理由在此处的作业中取消列出...但是这种方法也适用于多行时,即dat[ , letters := list(letterfy(y))] 也可以按预期工作。

    另一种选择是通过更改letterfy 将字母列分配为character 向量:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      相关资源
      最近更新 更多