基于独特的可变,行内订购组变量

时间:2019-02-01 19:50:48

标签: r database if-statement dplyr

我具有以下数据库(db)和以下变量

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(顺序== 1)

我一直在绞尽脑汁,无法想出R中的一种简单方法,可以逐行调整权重的顺序,使它们全部为:ab(等于Order == 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 :(得分:0)

检查此解决方案:

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))
相关问题