新来的R!
我有一个数据集,看起来像这样。
Df <- structure(list(Pat_ID = c("1123", "1134", "1138", "1139"),
study_group = c("1", "1", "0", "0"),
days_1 = c("-329", "-261", "0", "-165"),
HbA1c_Date_1 = c("11/7/2018", "31/10/2018", "28/8/2019", "17/05/2019"),
HbA1c_1= c("8.8", "7", "11.1", "10.1" ),
days_2= c("-196", "-168", "NA", "0"),
HbA1c_Date_2= c("3/20/2019", "01/02/2019", "NA", "29/10/19"),
HbA1c_2= c("9.1", "7.7", "NA", "11.9"),
days_3= c("-105", "0", "NA", "85"),
HbA1c_Date_3= c("6/19/2019","27/02/2019", "NA", "22/01/2020"),
HbA1c_3= c("9.1", "11.1", "NA", "8.4"),
days_4= c("0", "89", "NA", "NA"),
HbA1c_Date_4= c("10/2/2019", "19/07/2019", "NA", "NA"),
HbA1c_4= c("9.2", "10.1", "NA", "NA"),
days_5= c("97", "168", "NA", "NA"),
HbA1c_Date_5= c("1/7/2020", "16/10/2019", "NA", "NA"),
HbA1c_5= c("9.1", "8.1", "NA", "NA" ),
baseline = c("0", "0", "0", "0"),
followup_1 = c("97", "89", "NA", "85"),
followup_2 = c("NA", "168", "NA", "NA"),
followup_3 = c("NA", "NA", "NA", "NA"),
followup_4 = c("NA", "NA", "NA", "NA"),
followup_5 = c("NA", "NA", "NA", "NA"),
followup_6 = c("NA", "NA", "NA", "NA"),
followup_7 = c("NA", "NA", "NA", "NA"),
X0_month = c("1", "1", "1", "1"),
X1_month = c("0", "0", "0", "NA"),
X2_month = c("0", "0", "0", "NA"),
X3_month = c("0", "1", "0", "NA"),
X4_month = c("1", "0", "0", "1"),
X5_month = c("0", "0", "0", "NA"),
X6_month = c("0", "1", "0", "NA")), class = "data.frame", row.names = c(NA, -4L))
字符串
这是一个示例数据集。
其中:
PAt_ID是唯一的患者ID。Study_group表示干预组(1)或对照组(0)。HbA1c_Date_1、HbA1c_Date_2等是进行HbA 1c检测的日期。HbA1c_1、HbA1c_2等是相应的HbA 1c值。days_1、days_2等,表示与索引日期的时间差。baseline包含基线天数(从值为0的days_ columns导出)。followup_1、followup_2等表示距离基线的天数。month列是分类列,表示访视发生在哪个月。
输出数据集将集中在“baseline”、“followup”和“month”列。“baseline”和“followup”列包含天数(从“days”列中提取)。我希望R扫描“days_”列,并为每个患者提取相应天数的HbA 1c Date和HbA 1c Value。由于我的原始数据集是转置的/宽的,我希望它更长。
我需要重塑这个数据集,以创建一个具有以下结构的新数据集:
| 患者ID|学习小组|HbA 1c日期|HbA1c|月|
| --|--|--|--|--|
| 1123 | 1 |2019年10月2日|9.2| 0_month|
| 1123 | 1 |2020年1月7日|9.1| 4个月|
| 1134 | 1 |2019年2月27日|十一点一|0_month|
| 1134 | 1 |2019 - 07 - 19| 10.1| 3个月|
| 1134 | 1 |2019年10月16日|8.1| 6个月|
| 1138 | 0 |2019 - 08 - 28|十一点一|0_month|
| 1139 | 0 |29/10/19|十一点九|0_month|
| 1139 | 0 |2020年1月22日|8.9| 4个月|
我累了循环,但它并不适合我。
1条答案
按热度按时间oug3syen1#
这里有一些东西可以帮助你开始。
不使用循环,您可以使用
tidyr
(tidyverse的一部分)中的pivot_longer
来放入长格式。模式将关注日期和以数字结尾的A1 c值。values_transform
将天放入数字格式-但会抛出警告,因为该列中有“NA”字符值而不是NA
符号。看起来您只想保留0天后的A1 c值,因此
filter
可以在基线评估之前删除这些实验室值。接下来,mutate
将为给定患者的每个A1 c值添加一个计数器。最后的结果将与从
X0_month
到X6_month
数据派生的第二个data.frame结合使用,因此它可以被稍微不同地处理。在这里,您可以再次使用pivot_longer
,但然后filter
,其中值为“1”(并省略“0”)。计数器可以再次应用于每个患者。加入后,
select
将允许您包含感兴趣的列(按照您想要的顺序)。我没有解决其他格式问题(日期不是日期格式,月份作为数字月份值可能更好)。
字符串
输出
型