Упорядочить наборы переменных на основе уникальной переменной внутри строк - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть следующая база данных (дБ) со следующими переменными

ID = предметы
Порядок = порядок предметов (1 = ab, 2 = ba), который одинаков на всех экзаменах

Остальные переменные - это веса каждого субъекта (a и b) в разные периоды времени

Wa1 и Wb1 - веса на первом экзамене
Wa2 и Wb2 - веса на второмэкзамен
Wa3 и Wb3 - веса на третьем экзамене

| ID | Order | Wa1 | Wb1 | Wa2 | Wb2 | Wa3  | Wb3  |
+----+-------+-----+-----+-----+-----+------+------+  
|  1 |     1 | 423 | 252 | NA  | NA  |  234 |  675 |
|  2 |     1 | NA  | NA  | 245 | 856 | 3245 |  423 |
|  3 |     2 | NA  | NA  | NA  | NA  |  534 | 4574 |

Я хотел бы иметь возможность сделать базу данных равномерной, чтобы веса всегда были перечислены в следующем порядке: ab (Order== 1)

Я ломал голову и не могу придумать простой способ в R для построчного, отрегулировать порядок весов так, чтобы они все были: ab (что равноПорядок == 1)

Очень долгим и трудоемким решением было бы создать новый столбец для каждой переменной (Wa1.1 и Wb1.1 и т. Д. И т. Д.) И использовать операторы ifelse

db$Wa1.1 <- ifelse(db$Order == 2, db$Wb1, db$Wa1)
db$Wb1.1 <- ifelse(db$Order == 2, db$Wa1, db$Wb1)
db$Wa2.1 <- ifelse(db$Order == 2, db$Wb2, db$Wa2)
db$Wb2.1 <- ifelse(db$Order == 2, db$Wa2, db$Wb2)

Но это не практично, так как размермоя реальная база данных очень большая и включает в себя еще много экзаменов

Любая помощь с более простым и эффективным решением (возможно, с использованием dplyr?) очень ценится

Редактировать: В приведенном выше случае только строка, гдеID == 3 изменится (поменялись местами Wa3 и Wb3) и будет выглядеть следующим образом:

| ID | Order | Wa1 | Wb1 | Wa2 | Wb2 | Wa3  | Wb3  |
+----+-------+-----+-----+-----+-----+------+------+  
|  1 |     1 | 423 | 252 | NA  | NA  |  234 |  675 |
|  2 |     1 | NA  | NA  | 245 | 856 | 3245 |  423 |
|  3 |     2 | NA  | NA  | NA  | NA  | 4574 |  534 |

1 Ответ

0 голосов
/ 01 февраля 2019

Проверьте это решение:

library(tidyverse)

db %>%
  gather(exam, score, -c(ID, Order)) %>%
  mutate(exam = case_when(
    Order == 2 & str_detect(exam, 'Wa.') ~ str_replace(exam, 'a', 'b'),
    Order == 2 & str_detect(exam, 'Wb.') ~ str_replace(exam, 'b', 'a'),
    TRUE ~ exam
  )) %>%
  spread(exam, score) %>%
  select(colnames(db))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...