data.table:NA模糊unlist类型

时间:2015-09-24 03:51:24

标签: r data.table

我有一个未知列表作为data.table中的列。在下面的情况下,该列是z,它是一个字符列或将是。但是,列表的前两个元素是NA s,它们是合乎逻辑的。当我尝试unlist z列时出现以下错误:

Error in `[.data.table`(dat, , .(z = unlist(z)), by = x) : 
  Column 1 of result for group 2 is type 'logical' but expecting type 'character'. Column types must be consistent for each group

这是因为我混合了逻辑(NAcharacter)。我可以强制如下:dat[, .(y = as.character(unlist(y))), by='x']但问题是z未知。如何使NA的存在不会以一般化的方式抛出错误?

library(data.table)

dat <- data.frame(
    x = 1:3,
    stringsAsFactors = FALSE
)

dat[['y']] <- list(1:3, 5:6, 18:19)
dat[['z']] <- list(LETTERS[3:6], NA, LETTERS[13:16])
setDT(dat)

dat[, .(z = unlist(z)), by = x]

1 个答案:

答案 0 :(得分:2)

我们可以unlist然后relist以兼容格式制作''NA'

dat$z <- relist(unlist(dat$z), skeleton=dat$z)
setDT(dat)
DT <- dat[, .(z = unlist(z)), by = x]
DT$z
#[1] "C" "D" "E" "F" NA  "M" "N" "O" "P"
is.na(DT$z)
#[1] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE

或另一种选择是在'z'和length'z'列中的每个list元素的unlist复制'x'列。

dat[, .(x=rep(x, lengths(z)), z=unlist(z))]