首页 > 解决方案 > 在行内根据唯一变量对变量集进行排序

问题描述

我有以下具有以下变量的数据库(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 (Order == 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 |

标签: rdatabaseif-statementdplyr

解决方案


检查此解决方案:

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))

推荐阅读