2015-09-24 15 views
3

我有一個未知列表作爲data.table中的列。在該列下面的情況下,是z,它是一個字符列或將是。然而,列表中的前兩個元素是邏輯上的NA。當我嘗試unlistz專欄中,我得到以下錯誤:data.table:NA模糊未列表類型

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 

這是因爲我在混合邏輯(NA S和character)。我可以強制如下: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] 
+0

我想我們可以使用'NA_character_',它應該可以正常工作。即'dat [['z']] < - 列表(LETTERS [3:6],NA_character_,LETTERS [13:16])' – akrun

+0

@akrun,但這必須是可推廣的。它在一個不知道傳遞的類型的函數中。 –

+0

是否可以在'list'中檢查類型,然後相應地更改'NA'?否則,將所有'NA'轉換爲字符,然後將其更改爲真實NA。 – akrun

回答

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 

或者另一種選擇是每個length複製的「X」列'z'中的list元素和'z'列中的unlist

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

這工作。我會等待看看是否存在其他問題。 –