R:在具有许多列名称的 Dataframe 中将数据从宽转为长

问题描述 投票:0回答:1

我有一个数据集,反映了一小群人(~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”,但正在努力解决如何通过名称识别我的原始列并为新的“问题”列提取正确的部分。

r data-cleaning transpose
1个回答
0
投票
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)
)
© www.soinside.com 2019 - 2024. All rights reserved.