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

R 如果行中有NA,则挤压data.table,r,data.table,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:

我有一个
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
我们按“id”分组,
取消列出“Data.table的子集”(
.SD
),删除带有
NA的“NA”。省略
,按“id”创建序列列,然后
dcast
从“long”到“wide”

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建议的那样)

我们按“id”分组,
取消列出“Data.table的子集”(
.SD
),删除带有
NA的“NA”。省略
,按“id”创建序列列,然后
dcast
从“long”到“wide”

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建议的那样)


dt$v2
dt$v2不错。在我看来,它们应该停在
dt[,na.omit(unlist(.SD)),id]
上,这大致相当于
melt(dt,id=“id”,na.rm=TRUE)
Nice。在我看来,它们应该停在
dt[,na.omit(unlist(.SD)),id]
上,这大致相当于
melt(dt,id=“id”,na.rm=TRUE)
类似的东西:(还有一个
数据表
-answer),但您希望对行执行此操作。类似的东西:(还有一个
数据表
-answer)但您希望对行执行此操作。
melt(dt, id = "id", na.rm = TRUE)
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