将函数逐行应用于data.table

时间:2017-01-04 13:07:10

标签: r data.table

我最终获得了一个很大的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并返回一个新矩阵?

1 个答案:

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