我的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
答案 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