我具有以下数据库(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 |
答案 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))