data.table只在一行时将列表添加为列

时间:2015-08-17 15:35:09

标签: r data.table

我有使用 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

1 个答案:

答案 0 :(得分:4)

只需将输出包装在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))]也按预期工作。

另一个选项是通过更改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