2016-07-12 13 views
0

Ich habe einen Datenrahmen mit vielen Spalten, darunter vier, die Unterkategorien darstellt.Zeilenweise anwenden Reduzieren mit muate_?

data.frame(site_name=c("bla","blo","blu"), page_1=c(NA,NA,NA), page_2=c(NA,"detail_1","detail_2"), page_3=c("hello", "hola", NA), page_4=c(NA,NA,NA)) 

    site_name page_1 page_2 page_3 page_4 
1  bla  NA  <NA> hello  NA 
2  blo  NA detail_1 hola  NA 
3  blu  NA detail_2 <NA>  NA 

Ich möchte mit einem nur die am weitesten rechts stehende nicht-NA Detailebene zeigt einzelne Spalte, alle diese ‚page_x‘ Spalten ersetzen. Es gibt viele zeilenweise Fragen, aber ich kann keine finden, die mit NSE und Reduce arbeiten.

In dem obigen Beispiel das wäre:

site_name page_1 page_2 page_3 page_4  page 
1  bla  NA  <NA> hello  NA hello 
2  blo  NA detail_1 hola  NA  hola 
3  blu  NA detail_2 <NA>  NA detail_2 

Ich dachte, es ist ein gutes Beispiel würde jede Zeile reduzieren über zu verwenden. Ich habe eine Version, die in einer einzigen Zeile funktioniert, aber ich finde keine Möglichkeit, sie auf mutate_ anzuwenden.

Reduce(function(prec,col){ifelse(!is.na(row[col]), row[col], prec)}, 
     grep("^page",names(row),value=T), NA)} 

Dies funktioniert nicht (wie ich die 'Reihe' Objekt erraten wird auf diese Weise nicht wirklich bestanden):

mutate_(.dots = ~Reduce(function(prec,col){ifelse(!is.na(row[col]), row[col], prec)}, 
     grep("^page",names(row),value=T), NA)} 

Antwort

0

Hier ist eine andere Idee ist, ohne Reduce,

apply(df[2:ncol(df)], 1, function(i) tail(i[!is.na(i)], 1)) 
#[1] "hello" "hola"  "detail_2"