我想同时扩大和扩展,但有问题

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

这是一个示例表,我想合并数据,以便每个患者位于一行,每个测试日期/测试结果具有不同的列。

每个患者都有不同数量的测试/结果,数据框看起来与此类似。

患者ID 测试日期 测试结果
患者1 2020 年 1 月 1 日 100 厘泊/毫升
患者1 2022 年 2 月 12 日 49 cps/mL
患者2 2022 年 4 月 5 日 99 cps/mL
患者2 2023 年 2 月 9 日 29000 cps/mL
患者2 2021 年 8 月 22 日 800 cps/mL
患者3 2022 年 12 月 4 日 500000 cps/mL

我想输出如下:

患者ID 测试日期#1 测试结果#1 测试日期#2 测试结果#2 测试日期#3 测试结果#3
患者1 2020 年 1 月 1 日 100 厘泊/毫升 2022 年 2 月 12 日 49 cps/mL
患者2 2022 年 4 月 5 日 99 cps/mL 2023 年 2 月 9 日 29000 cps/mL 2021 年 8 月 22 日 800 cps/mL
患者3 2022 年 12 月 4 日 500000 cps/mL

我尝试了一些更宽和更分散的枢轴变体,但没有成功

r tidyr reshape
2个回答
1
投票
library(tidyverse)

# Your initial dataframe (df)
df <- data.frame(
  Patient_ID = c('Patient 1', 'Patient 1', 'Patient 2', 'Patient 2', 'Patient 2', 'Patient 3'),
  test_date = c('Jan 1 2020', 'February 12, 2022', 'April 5, 2022', 'February 9, 2023', 'August 22, 2021', 'December 4, 2022'),
  test_result = c('100 cps/mL', '49 cps/mL', '99 cps/mL', '29000 cps/mL', '800 cps/mL', '500000 cps/mL')
)
# Convert 'test_date' column to Date format
df$test_date <- as.Date(df$test_date, format = "%B %d, %Y")
# Order data by Patient and Date
df <- df %>% arrange(Patient_ID, test_date)
# Create a column to represent each unique test for each patient
df <- df %>% group_by(Patient_ID) %>% mutate(test_number = row_number())
# Now pivot wider using the new 'test_number' column
df_wide <- df %>% 
  pivot_wider(names_from = test_number, 
              values_from = c(test_date, test_result), 
              names_glue = "{.value} #{.name}") %>%
  arrange(Patient_ID)
df_wide

如果您想处理 NA 值,您可以添加

values_fill = NA
values_fill = ""
,具体取决于您希望如何处理 NA 情况。该行看起来像:

df_wide <- df %>% 
  pivot_wider(names_from = test_number, 
              values_from = c(test_date, test_result), 
              names_glue = "{.value} #{.name}", 
              values_fill = NA) %>%
  arrange(Patient_ID)

如果您还没有安装所需的软件包,请使用

install.packages("tidyverse")
来安装。


1
投票

使用

reshape
。使用
ave
,我们首先为数据提供一个新的 time 变量,以指示哪些日期属于一起。由于变量名为
"time"
reshape
会自动识别,我们不必显式指定它。

reshape(transform(d, time=ave(Patient.ID, Patient.ID, FUN=seq_along)),
        idvar='Patient.ID', direction='wide')

#   Patient.ID      test.date.1 test.result.1       test.date.2 test.result.2     test.date.3 test.result.3
# 1  Patient 1      Jan 1, 2020    100 cps/mL February 12, 2022     49 cps/mL            <NA>          <NA>
# 3  Patient 2    April 5, 2022     99 cps/mL  February 9, 2023  29000 cps/mL August 22, 2021    800 cps/mL
# 6  Patient 3 December 4, 2022 500000 cps/mL              <NA>          <NA>            <NA>          <NA>

数据:

d <- structure(list(Patient.ID = c("Patient 1", "Patient 1", "Patient 2", 
"Patient 2", "Patient 2", "Patient 3"), test.date = c("Jan 1, 2020", 
"February 12, 2022", "April 5, 2022", "February 9, 2023", "August 22, 2021", 
"December 4, 2022"), test.result = c("100 cps/mL", "49 cps/mL", 
"99 cps/mL", "29000 cps/mL", "800 cps/mL", "500000 cps/mL")), class = "data.frame", row.names = c(NA, 
-6L))
© www.soinside.com 2019 - 2024. All rights reserved.