data.table 当只有一行时添加列表作为列
data.table add list as column when only one row
我有使用 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
简单地将输出包裹在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
我有使用 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
简单地将输出包裹在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