创建列来调节数据集中行的行为

Create column conditioning the behavior of rows in the dataset

我想做一些非常具体的事情。我有大量数据,总而言之,这些数据或多或少看起来像这样,值为 0、1 和 2:

我需要创建一个 situation 变量,以便它包含值 0、1 和 2。

对于整行中仅包含 0 和 1 的情况,值为 0。

值 1 表示值 2 出现的情况,但在某些时候 1 出现在它之前。

值 2 出现值 2,但在某些时候 0 出现在它之前的情况。

所以它接近于:

structure(list(X1 = c(1, 1, 1, 1, 1, 1, 1, 1, 0, 1), X2 = c(1, 
1, 1, 1, 0, 0, 0, 0, 0, 2), X3 = c(0, 1, 1, 1, 1, 0, 0, 1, 0, 
0), X4 = c(0, 1, 1, 0, 1, 1, 0, 0, 0, 0), X5 = c(2, 1, 1, 0, 
2, 1, 1, 0, 0, 0), X6 = c(2, 1, 1, 0, 2, 1, 1, 0, 0, 0), X7 = c(2, 
1, 1, 1, 2, 1, 1, 2, 0, 0), X8 = c(0, 1, 1, 1, 2, 1, 2, 2, 2, 
0)), class = "data.frame", row.names = c(NA, 10L))

这是一个 tidyverse 方法。

我将首先将所有列连接在一起,然后使用 grepl() 查找 1202.

library(tidyverse)

df %>% rowwise() %>% 
  mutate(concat = paste(c_across(everything()), collapse = "")) %>% 
  ungroup() %>%
  mutate(situation = case_when(
    !grepl(2, concat) ~ 0,
    grepl("12", concat) ~ 1,
    grepl("02", concat) ~ 2
  )) %>% 
  select(-concat)

输出

# A tibble: 10 x 9
      X1    X2    X3    X4    X5    X6    X7    X8 situation
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>     <dbl>
 1     1     1     0     0     2     2     2     0         2
 2     1     1     1     1     1     1     1     1         0
 3     1     1     1     1     1     1     1     1         0
 4     1     1     1     0     0     0     1     1         0
 5     1     0     1     1     2     2     2     2         1
 6     1     0     0     1     1     1     1     1         0
 7     1     0     0     0     1     1     1     2         1
 8     1     0     1     0     0     0     2     2         2
 9     0     0     0     0     0     0     0     2         2
10     1     2     0     0     0     0     0     0         1

请注意,此解决方案假定:

  1. 2不会出现在第一列
  2. 1situation 中的 2 由数据集中 2 之前的数字定义
  3. 不会出现1202在同一行的情况

我编写了一个评分函数并将其应用于数据框的所有行。

score <- function(x) {
  a <- which(x == 2)
  ifelse(length(a) > 0, ifelse(a[1] >=2, 2 - x[a[1] - 1], 1), 0)
}

df <- structure(list(X1 = c(1, 1, 1, 1, 1, 1, 1, 1, 0, 1), 
                     X2 = c(1, 1, 1, 1, 0, 0, 0, 0, 0, 2), 
                     X3 = c(0, 1, 1, 1, 1, 0, 0, 1, 0, 0), 
                     X4 = c(0, 1, 1, 0, 1, 1, 0, 0, 0, 0), 
                     X5 = c(2, 1, 1, 0, 2, 1, 1, 0, 0, 0), 
                     X6 = c(2, 1, 1, 0, 2, 1, 1, 0, 0, 0), 
                     X7 = c(2, 1, 1, 1, 2, 1, 1, 2, 0, 0), 
                     X8 = c(0, 1, 1, 1, 2, 1, 2, 2, 2, 0)),
                class = "data.frame", row.names = c(NA, 10L))
df$situation <- sapply(1:nrow(df), function(i) score(as.numeric(df[i,])))
df