0

我有一个包含很多列的数据框,包括四个代表子类别的列。

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

我认为在每一行上使用 Reduce 是一个很好的例子。我有一个在单行上工作的版本,但我找不到将它应用于 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)}
4

1 回答 1

0

这是一个不同的想法Reduce,没有

apply(df[2:ncol(df)], 1, function(i) tail(i[!is.na(i)], 1))
#[1] "hello"    "hola"     "detail_2"
于 2016-07-12T07:53:17.843 回答