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$v2dt$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