2016-07-12 41 views
0

我有一個有很多列的數據框,包括四個代表子類別的數據框。使用row-wise Reduate with mutate_?

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 

我想用一列代替所有這些'page_x'列,只顯示最右邊的非NA級別的細節。有很多行問題,但我找不到一個與NSE和Reduce一起工作的人。

在上面的例子是:

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 

我認爲這將是一個很好的例子,用每行減少過度。我在單行上有一個版本,但我找不到將它應用於mutate_的方法。

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

這不起作用(我猜 '行' 的對象是不是真的就這樣過去了):

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

回答

0

這裏是沒有Reduce不同的想法,

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