R 将函数按行应用于data.table

R 将函数按行应用于data.table,r,data.table,R,Data.table,最后我得到了一个bigdata.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

最后我得到了一个bigdata.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)]

trimt我们可以使用
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

setnames(sdata[,{un1我们可以使用
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

setnames(sdata[,,{un1对于第一行,为什么您有15 32 21,顺序不对'我想删除NAs,然后反转该行的其余部分,为缺少的值添加NAs并替换该行。发布了一个基于数据的解决方案。Table一般来说,最好也描述一下您的函数要做什么,而不是简单地显示它。您的
apply
代码是太复杂了,我不清楚它在做什么。对于第一行,为什么有15 32 21,顺序不正确‘我想删除NAs,然后反转该行的其余部分,为缺少的值添加NAs并替换该行。发布了一个基于数据的解决方案。表一般来说,最好也描述一下您的函数的含义做,而不是简单地展示。你的
应用
代码非常复杂,我不知道它在做什么。谢谢。它工作得很好!(而且快得多)谢谢。它工作得很好!(而且快得多)