如何在 R 中执行列的滚动合并

Jua*_*n C 5 r coalesce dplyr

我有一个像这样的数据框:

stage1 stage2 stage3 stage4
a        NA     b      c
NA       d      NA     e
NA       NA     f      g
NA       NA     NA     h
Run Code Online (Sandbox Code Playgroud)

其中每一列都是流程的一个阶段。我想要做的是根据前面的列合并每一列:

stage1 stage2 stage3 stage4 
a        a      a      a
NA       d      d      d
NA       NA     f      f
NA       NA     NA     h
Run Code Online (Sandbox Code Playgroud)

实际值并不重要,这也可能是一个逻辑数据帧,其中输出的每个字符串是TRUE,每个 NA 是FALSE

我编写了这个函数,可以让我合并选择的列:

coacross <- function(...) {
  coalesce(!!!across(...))
}

df <- df %>%
  mutate(total_stages = coacross(everything()))
Run Code Online (Sandbox Code Playgroud)

这基本上创建了stage4我想要的输出列。有什么方法可以迭代运行这个,最好没有 for 循环?stage2那么我可以对和做同样的事情stage3吗?否则,还有其他方法可以做到这一点吗?

多谢。

编辑:

这有效:

for(col in names(df %>% select(-stage1))){
  print(col)
  df = df %>%
    mutate({{col}} := coacross(stage1:{{col}}))
  
}
Run Code Online (Sandbox Code Playgroud)

但任何更优雅的解决方案将不胜感激

Ony*_*mbu 8

你也可以使用accumulate

\n
library(tidyverse)\nas_tibble(accumulate(df, coalesce))\n\n# A tibble: 4 \xc3\x97 4\n  stage1 stage2 stage3 stage4\n  <chr>  <chr>  <chr>  <chr> \n1 a      a      a      a     \n2 NA     d      d      d     \n3 NA     NA     f      f     \n4 NA     NA     NA     h  \n
Run Code Online (Sandbox Code Playgroud)\n


zep*_*ryl 2

您可以across()在以下人员的协助下使用cur_column()

library(dplyr)

df %>%
  mutate(across(everything(), \(x) coacross(stage1:cur_column())))
Run Code Online (Sandbox Code Playgroud)
  stage1 stage2 stage3 stage4
1      a      a      a      a
2   <NA>      d      d      d
3   <NA>   <NA>      f      f
4   <NA>   <NA>   <NA>      h
Run Code Online (Sandbox Code Playgroud)