2017-01-04 5 views
0

大きなdata.tableで終了し、行ごとに関数を適用したい。それはdata.frameで動作し、適用されますが、私はdata.tableで解決策を得たいと思います。 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 

は、私はそれを次の方法を試してみました

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)] 

ので

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)]))))) 

を使用することができますdata.frameで

>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.tableを使用して新しい行列を適用して返すことは可能ですか?

+0

を使用することができ、なぜあなたは15 32 21を持っているか、順序は適切ではない」 – akrun

+0

私は、NASを削除する、その行の残りの部分を逆にし、欠損値のNAsを追加して行を置き換えます。 – Frank123

+0

data.tableに基づいてソリューションを投稿しました – akrun

答えて

1

我々は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 
+1

ありがとうございます。それはうまく動作します! (そしてずっと速く) – Frank123

関連する問題