如果行中有NA,则挤压data.table

时间:2016-05-13 12:04:59

标签: r data.table

我的data.table有很多NAs。我想挤压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

2 个答案:

答案 0 :(得分:5)

我们按&#34; id&#34;,unlist分组&#34; Data.table的子集&#34; (.SD),删除&#34; NA&#34;使用na.omit,按照&#39; id&#39;创建一个序列列,然后从&#39; long&#39;创建dcast。广泛的&#39;。

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)

答案 1 :(得分:-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