在 R 中使用某些列创建多个新行

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

我有一个数据集,其中包括为每位患者收集的多个生物样本,但在数据输出中,所有样本都位于同一行。我想操纵数据,使每个样本都在自己的行中。

数据框当前如下所示:(这是数据的简化假版本)

Patient_ID   Patient_name   Sample_1_ID   Sample_1_value1  Sample_1_value2   Sample_2_ID   Sample_2_value1   Sample_2_value2  Sample_3_ID   Sample_3_value1   Sample_3_value2
AB100         AB             CSF            1.0             2.0               CSF            2.0               3.0             CSF              2.0             4.0
JM200         JM             CSF            2.0             3.0               CSF            4.0               5.0             CSF              3.0             4.0

我希望最终的数据框看起来像:

Patient_ID   Patient_name   Sample_ID   Sample_value1  Sample_value2
AB100          AB             CSF            1.0             2.0
AB100          AB             CSF            2.0             3.0
AB100          AB             CSF            2.0             4.0
JM200          JM             CSF            2.0             3.0
JM200          JM             CSF            4.0             5.0
JM200          JM             CSF            3.0             4.0

我尝试使用 dplyr 的

add_row()
函数来执行此操作,但我不知道如何在仅向下移动样本数据的同时复制患者标识符行。

提前谢谢您。

r dplyr
1个回答
0
投票

这个概念称为将数据转换为“长格式”

下面是完成此操作的 R 语法:

我们将使用 tidyverse

library(tidyverse)

long_df <- df %>%
    pivot_longer(
        cols = -c(Patient_ID, Patient_name), 
        names_to = c(".value", "set"), 
        names_pattern = "(.*)_(.*)"
    )
  • cols = -c(Patient_ID, Patient_name):指定要显示的列 转换。 - 表示除 Patient_ID 和之外的所有列 Patient_name 应该转换。
  • names_to = c(".value", "set"): 这告诉函数如何创建新的列名称。 。价值 指示应使用原始列名的一部分作为 新列名称(即 ID、value1、value2)。
  • 名称模式= “(.*)_(.*)”:此正则表达式捕获 列名称。第一个 (.*) 捕获前缀(例如 Sample_1)并 第二个 (.*) 捕获后缀 (ID, value1, value2),其中 对应于新的列名称。
© www.soinside.com 2019 - 2024. All rights reserved.