我有一个数据集,反映了一小群人(~30)对练习问题的回答。该数据集非常广泛,包含一年中每天发送的问题的数据。对于发送的每个问题,我都有以下数据:1)响应时间(例如“cardiology_1_timestamp”),2)给出的答案(例如“cardiology_1”),3)正确答案/关键(例如“cardiology_1_key”) , 4) 以及受访者是否回答问题的指示符(例如“cardiology_1_complete”)。所有列组的命名约定都遵循此模式,但关键字发生变化。例如“cardiology”可以是“nutrition”或“免疫学”。每个类别的数字也不一致(心脏有 90 个,营养有 20 个等),尽管每个类别中的每个问题都用一个连续的整数标识 - 但如下所示,这个整数标识符并不总是该列名字后缀。
有
记录_ID | cardiology_1_timestamp | 心脏病学_1 | 心脏病学_key_1 | 心脏病学_1_完整 |
---|---|---|---|---|
1 | 2019-07-10 12:45:49 | 1 | 4 | 2 |
2 | 2019-07-11 21:38:52 | 4 | 4 | 2 |
我想要长格式的数据,每列一列用于描述的特征(时间戳、给出的响应、正确答案和完成问题)以及指示问题的新列。对于本示例,这将是一个值为“cardiology_1”的新列。
想要
记录_ID | 问题 | 时间戳 | 回应 | 钥匙 | 完成 |
---|---|---|---|---|---|
1 | 心脏病学_1 | 2019-07-10 12:45:49 | 1 | 4 | 2 |
1 | 心脏病学_2 | 2019-07-11 11:20:22 | 2 | 2 | 2 |
2 | 心脏病学_1 | 2019-07-11 21:38:52 | 4 | 4 | 2 |
2 | 心脏病学_2 | 2019-07-12 01:20:46 | 2 | 2 | 2 |
我对 R 比较陌生(通常是 SAS 用户),但我正在尝试解决这个问题。我尝试使用“pivot_longer”,但正在努力解决如何通过名称识别我的原始列并为新的“问题”列提取正确的部分。
library(tidyverse)
colnames(df) <- str_replace_all(colnames(df), pattern = c("key_(\\d+)" = "\\1_solution", "(?<=\\d$)" = "_answer"))
df |>
pivot_longer(
cols = -Record_ID,
names_to = c("type", "group", ".value"),
names_sep = "_")
输出:
# A tibble: 2 × 7
Record_ID type group timestamp answer solution complete
<dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl>
1 1 cardiology 1 2019-07-10 12:45:49 1 4 2
2 2 cardiology 1 2019-07-11 21:38:52 4 4 2
数据:
df <- data.frame(
Record_ID = c(1, 2),
cardiology_1_timestamp = c("2019-07-10 12:45:49", "2019-07-11 21:38:52"),
cardiology_1 = c(1, 4),
cardiology_key_1 = c(4, 4),
cardiology_1_complete = c(2, 2)
)