我有一个复杂的数据框架,我想从宽到长。每一行都有一列患者ID,其余列是患者的药物及其详细信息(例如,药物剂量、单位等)。然而,病人正在进行的所有干预都是在一个很长的序列中进行的。
patient_id <- c(1,2)
med1_name <- c("Drug Alpha","Drug Beta")
med1_dose <- c(50,100)
med1_unit <- c("mg","mg")
med1_schedule <- c("Twice a Day","Once a Day")
med1_route <- c("Oral","Oral")
med1_startdate <-c(07/08/2015,08/08/2015)
med1_enddate <- c(07/08/2020,08/08/2020)
med2_name <- c("Drug Gamma","Drug Delta")
med2_dose <- c(125,80)
med2_unit <- c("mg","g")
med2_schedule <- c("When needed","Once a Day")
med2_route <- c("Oral","Oral")
med2_startdate <-c(07/08/2015,08/08/2015)
med2_enddate <- c(07/08/2020,08/08/2020)
patientmedslist <- data.frame(patient_id,med1_name,med1_dose,med1_unit,med1_schedule,med1_route,med1_startdate,med1_enddate,med2_name,med2_dose,med2_unit,med2_schedule,med2_route,med2_startdate,med2_enddate)
我想将每7列的内容旋转到一个新的行中(本质上,第2-8列被标记为"med1_name“、"med1_dose”、"med1_unit“等,第9-16列是"med2_name”、"med2_dose“、"med2_unit”等)。这些长列名不会改变,并且每个药物始终有7列数据。
我已经尝试了以下pivot_longer代码:
splitter = pivot_longer (patientmedslist,
cols =med1_name:med100_ongoing,
names_to=c("name","dose","unit","schedule","route","prestudy","startdate","enddate","ongoing"),
names_sep = "_",
values_to =c("name","dose","unit","schedule","route","prestudy","startdate","enddate","ongoing")
)
它会给我一条关于丢失部件的错误信息。
会非常感谢任何人的帮助。
发布于 2021-02-18 18:38:19
也许我们可以利用
library(tidyr)
pivot_longer(patientmedslist, cols = -patient_id,
names_to = c('group', '.value'), names_sep='_')
-output
# A tibble: 4 x 9
# patient_id group name dose unit schedule route startdate enddate
# <dbl> <chr> <chr> <dbl> <chr> <chr> <chr> <dbl> <dbl>
#1 1 med1 Drug Alpha 50 mg Twice a Day Oral 0.000434 0.000433
#2 1 med2 Drug Gamma 125 mg When needed Oral 0.000434 0.000433
#3 2 med1 Drug Beta 100 mg Once a Day Oral 0.000496 0.000495
#4 2 med2 Drug Delta 80 g Once a Day Oral 0.000496 0.000495
https://stackoverflow.com/questions/66266019
复制