r - 在行内根据唯一变量对变量集进行排序
问题描述
我有以下具有以下变量的数据库(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 |
解决方案
检查此解决方案:
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))
推荐阅读
- c - 线程 VS 进程 (C)
- python - 如何通过行首的字母间隔在Python中浏览csv
- graphql - Apollo 客户端未使用预期的 uri 连接远程 GraphQL 服务器
- linux - 在汇编中编写随机数生成器的奇怪行为
- ffmpeg - 将大量 MP3 文件转换为 YouTube 视频,每个都使用相同的 JPEG 图像
- xamarin - KFGQPC Uthmanic Script HAFS 无法正确塑造 Xamarin 表单中的阿拉伯数字
- r - 在两个字符串中查找匹配对
- php - 如果 MySQL 上的语句以不同的顺序产生结果
- scala - prepend 如何保持 List 的不变性,而 append 却没有?
- javascript - 使用 JavaScript 的 Document.write() 创建 HTML 链接