我有一个像这样的数据框:
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)
但任何更优雅的解决方案将不胜感激
你也可以使用accumulate:
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 \nRun Code Online (Sandbox Code Playgroud)\n
您可以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)