2016-07-28 16 views
1

ich einen Datenrahmen haben, die wie folgt aussieht:vorletzte nicht leere Zeile Schwanz Ersetzen durch NA in R

df <- read.table(tc <- textConnection(" 
var1 var2 var3 var4 
1  2  7  NA 
4  4  NA  6 
2  NA  3  NA     
4  4  4  4    
1  3  NA  NA"), header = TRUE); close(tc) 

ich die vorletzte nicht leere Zeile Schwänze mit NAs ersetzen wollen, um mir eine neue Daten Rahmen, der wie folgt aussieht:

df <- read.table(tc <- textConnection(" 
var1 var2 var3 var4 
1  NA  7  NA 
4  NA  NA  6 
NA  NA  3  NA     
4  4  NA  4    
NA  3  NA  NA"), header = TRUE); close(tc) 

ich bin in der Lage, die Position der vorletzten nicht leeren Zeile Schwanz zu identifizieren, indem Sie die Anweisung mit:

penultimate <- function(x) head(tail(x[!is.na(x)], 2),1) 

Mein Problem ist, wie man diese jetzt zu NAs ändert.

+0

mit Es ist nicht klar, wie sich die Werte mit NAs ersetzt werden. Zum Beispiel sind in der ersten Spalte 3 und 5 Zeilen NA und in der zweiten Spalte 3 Zeilen NA. – akrun

+0

Können Sie näher erläutern, was "vorletzter nicht leerer Reihenschwanz" bedeutet? –

+0

@akrun, der Ersatz erfolgt nach Zeile und nicht nach Spalte. Beachten Sie, dass in der ersten Zeile des ursprünglichen Datenrahmens der vorletzte Nicht-NA-Wert 2 ist, der nun im neuen Datenrahmen durch NA ersetzt wird. Für die zweite Zeile ist der vorletzte Wert im ursprünglichen Datenrahmen 4, der jetzt im neuen Datenrahmen durch NA ersetzt wird. Holen Sie sich das Muster jetzt? – user1783739

Antwort

2

Wir verwenden apply

penultimate <- function(x) replace(x, head(tail(which(!is.na(x)), 2),1), NA) 
t(apply(df, 1, penultimate)) 
#  var1 var2 var3 var4 
#[1,] 1 NA 7 NA 
#[2,] 4 NA NA 6 
#[3,] NA NA 3 NA 
#[4,] 4 4 NA 4 
#[5,] NA 3 NA NA 

Oder können wir which mit arr.ind=TRUE

i1 <- which(!is.na(df), arr.ind=TRUE) 
df[i1[!!ave(i1[,2], i1[,1], FUN = function(x) rank(-x)==2),]] <- NA 

verwenden Wenn wir dplyr verwenden müssen, die rowwise mit do kann die erwartete Ausgabe

erhalten
library(dplyr) 
df %>% 
    rowwise() %>% 
    do(data.frame(t(penultimate(unlist(.))))) 
# var1 var2 var3 var4 
# <int> <int> <int> <int> 
#1  1 NA  7 NA 
#2  4 NA NA  6 
#3 NA NA  3 NA 
#4  4  4 NA  4 
#5 NA  3 NA NA 

Oder data.table

library(data.table) 
setDT(df)[, as.list(penultimate(unlist(.SD))), .(rn= 1:nrow(df))][, rn := NULL][]