我最终获得了一个很大的data.table,我希望每行应用一个函数。它适用于data.frame和apply,但我希望得到一个data.table的解决方案。
>sdata
Z_2016_11 Z_2016_10 Z_2016_09 Z_2016_08 Z_2016_07
1: 21 32 15 NA NA
2: 6 17 NA NA NA
3: 2 7 9 230 NA
4: 5 19 28 30 0
5: 16 29 30 105 0
6: 2 0 0 0 NA
我想按照以下顺序订购
>sdata
Z_1 Z_2 Z_3 Z_4 Z_5
1: 15 32 21 NA NA
2: 17 6 NA NA NA
3: 230 9 7 2 NA
4: 0 30 28 19 5
5: 0 105 30 29 16
6: 0 0 0 2 NA
使用data.frame我可以使用
t(apply(sdata[, grep("Z", names(sdata), value = TRUE),with=FALSE],1,
function(tmp) c(rev(tmp[!is.na(tmp)]),
rep(NA, times = length(tmp) - length(tmp[!is.na(tmp)])))))
我按照以下方式尝试了
trimt <- function(tmp){
c(rev(tmp[!is.na(tmp)]), rep(NA, times = length(tmp) - length(tmp[!is.na(tmp)])))
}
sdata[,trimt(get(grep("Z", names(sdata), value = TRUE))),by=1:nrow(sdata)]
所以我可以轻松订购,但只返回一个矢量。是否可以使用data.table类似于apply并返回一个新矩阵?
答案 0 :(得分:2)
我们可以使用data.table
方法
setnames(sdata[, {un1 <- unlist(.SD)
as.list(`length<-`(rev(un1[!is.na(un1)]), length(un1)))
} , by = .(grp=1:nrow(sdata))][, grp := NULL], paste0("Z", 1:5))[]
# Z1 Z2 Z3 Z4 Z5
#1: 15 32 21 NA NA
#2: 17 6 NA NA NA
#3: 230 9 7 2 NA
#4: 0 30 28 19 5
#5: 0 105 30 29 16
#6: 0 0 0 2 NA