2017-01-04 3 views
0

Ich endete mit einer großen data.table und ich möchte eine Funktion pro Zeile anwenden. Es funktioniert mit data.frame und apply, aber ich möchte eine Lösung mit data.table bekommen.Wenden Sie eine Funktion zeilenweise auf eine 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 

Ich möchte es bestellen, wie folgend

>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 

Mit einem data.frame I

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

Ich versuchte es die folgende Art und Weise

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

So können Ich kann es leicht bestellen, aber nur ein Vektor kehrt zurück. Ist es möglich, eine data.table ähnlich wie apply zu verwenden und eine neue Matrix zurückzugeben?

+0

Für die erste Reihe, warum Sie 15 32 21 tun haben, ist die Reihenfolge nicht richtig‘ – akrun

+0

Ich möchte die nationalen Agenturen entfernen, dann umgekehrt den Rest der Zeile und fügen Sie NAs für die fehlenden Werte hinzu und ersetzen Sie die Zeile. – Frank123

+0

Eine Lösung basierend auf data.table geschrieben – akrun

Antwort

1

Wir verwenden data.table Methoden

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

Danke. Es funktioniert gut! (und viel schneller) – Frank123

Verwandte Themen