R语言 基于行号的条件指示符

cyvaqqii  于 2023-01-28  发布在  其他
关注(0)|答案(3)|浏览(130)

我有下面的数据框。我想做一个列,如果ind_2 = 1第一,在任何其他行之前,然后把1。
| 列数|ind_1|ind_2|ind_3|
| - ------|- ------|- ------|- ------|
| 1个|无|无|无|
| 第二章|无|1个|无|
| 三个|1个|无|无|
| 四个|无|1个|1个|
期望输出:
| 列数|ind_1|ind_2|ind_3|主索引|
| - ------|- ------|- ------|- ------|- ------|
| 1个|无|无|无|无|
| 第二章|无|1个|无|1个|
| 三个|1个|无|无|无|
| 四个|无|1个|1个|无|

llmtgqce

llmtgqce1#

您可以检查which行的第一个值是否为1,并根据row_number检查它是否需要返回1或0,如下所示:

library(dplyr)
df %>%
  mutate(master_ind = ifelse(row_number() == min(which(ind_2 == 1)), 1, 0))
#>   row_number ind_1 ind_2 ind_3 master_ind
#> 1          1     0     0     0          0
#> 2          2     0     1     0          1
#> 3          3     1     0     0          0
#> 4          4     0     1     1          0

创建于2023年1月25日,使用reprex v2.0.2

9jyewag0

9jyewag02#

我们可以使用base R来完成此操作

df1$master_ind <- +( df1[,2] == 0 &
     apply(df1[-1], 1, \(x) sum(cumsum(x[-1] == 1) == 1)) > 1
)
  • 输出
df1
  rownumber ind_1 ind_2 ind_3 master_ind
1         1     0     0     0          0
2         2     0     1     0          1
3         3     1     0     0          0
4         4     0     1     1          0

数据

df1 <- structure(list(rownumber = 1:4, ind_1 = c(0L, 0L, 1L, 0L), ind_2 = c(0L, 
1L, 0L, 1L), ind_3 = c(0L, 0L, 0L, 1L)), row.names = c(NA, -4L
), class = "data.frame")
dsekswqp

dsekswqp3#

您可以使用match

df1 %>% 
  mutate(master_ind = +(rownumber == match(1, df1$ind_2)))

  rownumber ind_1 ind_2 ind_3 master_ind
1         1     0     0     0          0
2         2     0     1     0          1
3         3     1     0     0          0
4         4     0     1     1          0

相关问题