2016-05-13 34 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