我有如下二进制数据:

ID <- c("A", "B", "C", "D", "E", "F")
Q0 <- c(0, 0, 0, 0, 0, 0)
Q1 <- c(0, 1, 0, 0, NA, 1) 
Q2 <- c(0, NA, 1, 0, NA, 1) 
Q3 <- c(0, NA, NA, 1, NA, 1) 
Q4 <- c(0, NA, NA, 1, NA, 1)

dta <- data.frame(ID, Q0, Q1, Q2, Q3, Q4)

如果其中一列中的行为1,则所有后续列也应为1.如果有0或NA,则下一列应保持原样.我编写了以下代码:

dta2  <- dta %>% 
  mutate(Q2 = case_when(Q1 == 1 ~ 1, 
                        TRUE ~ Q2))

dta3  <- dta2 %>% 
  mutate(Q3 = case_when(Q2 == 1 ~ 1, 
                        TRUE ~ Q3))

dta4  <- dta3 %>% 
  mutate(Q4 = case_when(Q3 == 1 ~ 1, 
                        TRUE ~ Q4))

它工作正常,输出看起来与预期相符:

ID    Q0    Q1    Q2    Q3    Q4
A     0     0     0     0     0
B     0     1     1     1     1
C     0     0     1     1     1
D     0     0     0     1     1
E     0     NA    NA    NA    NA
F     0     1     1     1     1

我的问题是:有没有更优雅的方法?也许使用apply或甚至一个for循环?

推荐答案

还有一个dplyr+purrr选项可以是:

dta %>%
 mutate(pmap_dfr(across(-ID), ~ `[<-`(c(...), seq_along(c(...)) > match(1, c(...)), 1)))

  ID Q0 Q1 Q2 Q3 Q4
1  A  0  0  0  0  0
2  B  0  1  1  1  1
3  C  0  0  1  1  1
4  D  0  0  0  1  1
5  E  0 NA NA NA NA
6  F  0  1  1  1  1

R相关问答推荐

在之前合并的数据.tables中分配新列后.internal.selfref无效

想要创建一个可以存储四个多元正态总体的多元偏度的载体

使用列表列作为case_when LHS的输入

提取rame中对应r中某个变量的n个最小正值和n个最大负值的条目

将带有范围的字符串转换为R中的数字载体

根据R中的另一个日期从多列中 Select 最近的日期和相应的结果

如何从当前行上方找到符合特定条件的最接近值?

在另一个函数中调用ggplot2美学

lightgbm发动机在tidymmodels中的L1正则化""

二维样条,严格以一个参数递增

gganimate在使用shadow_mark选项时不保留所有过go 的标记

在R中为马赛克图中的每个字段着色

使用geom_segment()对y轴排序

如何在Chart_Series()中更改轴值的 colored颜色 ?

使用across,starts_with和ifelse语句变更多个变量

我如何才能找到FAMILY=POISSON(LINK=&Q;LOG&Q;)中的模型预测指定值的日期?

如何将SAS数据集的列名和列标签同时包含在r中GT表的表首?

如何在科学记数法中显示因子

为左表中的所有行使用值Fill滚动左连接

在具有多个响应变量的比例堆叠条形图上方添加总计