Расширенная функция if / then / loop для создания новых столбцов - PullRequest
0 голосов
/ 05 мая 2018

Я изучаю R (фокусируется на пакетах tidyverse ) и надеюсь, что кто-то может помочь в решении следующей проблемы, которая поставила меня в тупик.

У меня есть набор данных, который выглядит примерно так:

library("tibble")
myData <- frame_data(
  ~id, ~r1, ~r2, ~r3, ~r4, ~r5, ~r6, ~r7, ~r8, ~r9, ~r10, ~r11, ~r12, ~r13, ~r14, ~r15, ~r16,
  "A", 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  "B", 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  "C", 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2,
  "D", 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, 2, 2, 2,
  "E", 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
)

По сути, у меня есть несколько строк данных респондентов, и каждый респондент дал 16 ответов либо «1», либо «2».

Для каждого респондента (т.е. для каждой строки) я хотел бы создать дополнительные три столбца:

В первом новом столбце, называемом «switchCount», указывается, сколько раз респондент переключался с ответа «2» на ответ «1».

Во втором новом столбце, называемом «switch1», указывается индекс первого времени, когда респондент переключился с ответа «2» на ответ «1».

В третьем новом столбце, называемом «switch2», указывается индекс окончательного времени, когда респондент переключился с ответа «2» на ответ «1».

Если переключателя нет и все значения равны «2», вернуть индекс 0. 0. 1022 *

Если переключателя нет и все значения равны «1», вернуть индекс 16.

Окончательный набор данных должен выглядеть следующим образом:

myData <- frame_data(
  ~id, ~r1, ~r2, ~r3, ~r4, ~r5, ~r6, ~r7, ~r8, ~r9, ~r10, ~r11, ~r12, ~r13, ~r14, ~r15, ~r16, ~switchCount, ~switch1, ~switch2,
  "A", 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 1,
  "B", 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4,
  "C", 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 3, 9,
  "D", 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 3, 6, 15,
  "E", 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 16, 16
)

1 Ответ

0 голосов
/ 05 мая 2018

Одним из подходов может быть объединение всех столбцов ответов по строкам, а затем поиск вхождений 2,1 с использованием gregexpr

library(dplyr)

myData %>%
  rowwise() %>%
  mutate(concat_cols = paste(r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,sep=";"),
         switchCount = ifelse(gregexpr("2;1", concat_cols)[[1]][1] == -1, 
                              0, 
                              length(gregexpr("2;1", concat_cols)[[1]])),
         switch1     = ifelse(switchCount == 0, 
                              ifelse(grepl("2",concat_cols), 1, 16),
                              min(floor(gregexpr("2;1", concat_cols)[[1]]/2)+1)),
         switch2     = ifelse(switchCount == 0, 
                              ifelse(grepl("2",concat_cols), 1, 16),
                              max(floor(gregexpr("2;1", concat_cols)[[1]]/2)+1)))  %>%
  select(-concat_cols)

Вывод:

  id r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 switchCount switch1 switch2
1  A  2  2  2  2  2  2  2  2  2   2   2   2   2   2   2   2           0       1       1
2  B  2  2  2  2  1  1  1  1  1   1   1   1   1   1   1   1           1       4       4
3  C  2  2  2  1  1  1  2  2  2   1   1   1   1   2   2   2           2       3       9
4  D  1  1  2  2  2  2  1  1  2   2   1   1   1   2   2   1           3       6      15
5  E  1  1  1  1  1  1  1  1  1   1   1   1   1   1   1   1           0      16      16

Пример данных:

myData <- structure(list(id = c("A", "B", "C", "D", "E"), r1 = c(2, 2, 
2, 1, 1), r2 = c(2, 2, 2, 1, 1), r3 = c(2, 2, 2, 2, 1), r4 = c(2, 
2, 1, 2, 1), r5 = c(2, 1, 1, 2, 1), r6 = c(2, 1, 1, 2, 1), r7 = c(2, 
1, 2, 1, 1), r8 = c(2, 1, 2, 1, 1), r9 = c(2, 1, 2, 2, 1), r10 = c(2, 
1, 1, 2, 1), r11 = c(2, 1, 1, 1, 1), r12 = c(2, 1, 1, 1, 1), 
    r13 = c(2, 1, 1, 1, 1), r14 = c(2, 1, 2, 2, 1), r15 = c(2, 
    1, 2, 2, 1), r16 = c(2, 1, 2, 1, 1), switchCount = c(0, 1, 
    2, 3, 0), switch1 = c(1, 4, 3, 6, 16), switch2 = c(1, 4, 
    9, 15, 16)), row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...