2016-05-13 70 views
0

我有一個data.table,它有很多NAs。我想擠data.table,以便它可以在一個緊湊的方式表示如果行中有NA,則擠壓data.table

dt <- data.table(id=1:5, c('x',NA,'y',NA,'y'), c(NA,NA,NA,NA,'z'), c('y','z','y','x',NA)) 
dt 
> id V2 V3 V4 
>1: 1 x NA y 
>2: 2 NA NA z 
>3: 3 y NA y 
>4: 4 NA NA x 
>5: 5 y z NA 

我要找的輸出是

dt 
> id V2 V3 
>1: 1 x y 
>2: 2 z NA 
>3: 3 y y 
>4: 4 x NA 
>5: 5 y z 
+0

東西:http://stackoverflow.com/questions/36639599/remove-leading-nas-to- align-data(還有一個'data.table'-答案)但是你想爲行做這件事。 – jogo

回答

5

我們組的「ID」,unlist「數據的子集.table「(.SD),用na.omit刪除」NA「,按'id'創建序列,然後從'long'到'wide'創建dcast

library(data.table) 
dcast(dt[, na.omit(unlist(.SD)) , id][, N:= paste0("V", 1:.N), id], id~N, value.var="V1") 
# id V1 V2 
#1: 1 x y 
#2: 2 z NA 
#3: 3 y y 
#4: 4 x NA 
#5: 5 y z 

或者我們可以使用melt(如@Frank建議)相似

melt(dt, id = "id", na.rm = TRUE) 
+3

不錯。在我看來,他們應該停止在'dt [,na.omit(unlist(.SD)),id]'這大致相當於'melt(dt,id =「id」,na.rm = TRUE) – Frank

-1
dt$v2 <-ifelse(is.na(dt$v2),dt$v4,dt$v2) 
dt$v3[1] <- replace(dt$v3[1],is.na(dt$v3[1]),dt$v4[1]) 
dt$v3[3] <- replace(dt$v3[3],is.na(dt$v3[3]),dt$v4[3]) 
dt$v4 <- NULL