临床研究中,常用EDC系统收集数据。一般导出的数据都是纵向数据,但纵向数据对于广大的临床医生来说并不友好。往往需要手动把纵向数据变为横向数据才能进行数据分析。不仅费时费力,而且容易出现复制粘贴错误。
作者在进行统计分析工作当中,早期也遇到同样的数据问题,比如5个访视的20个指标血常规数据,拉直后就会衍生成100个新变量,手动整理太费时间了。好在可以通过编程来自动实现纵向数据的拉横。小编自己写了一个function()来解决这个问题。
data<-mydata[c("SUBJID","AVISITN","PARAM","AVAL")] #SUBJID是唯一编号,AVISITN是访视号,PARAM是检查项,AVAL是值
ZONGHENG<-function(data){
AAA<-data.frame(table(data$AVISITN))
AAA<-AAA[1] #提取访视号有几类,后面变量重命名需要
BBB<-data.frame(table(data$PARAM))
BBB<-BBB[1] #提取检查项名称有几类,后面变量重命名需要
SUBJID<-NA
dataTT<-data.frame(SUBJID) #建立一个空数据集备用
for (i in 1:length(AAA$Var1)) {
for (j in 1:length(BBB$Var1)) {
dataccc<-subset(data,data$AVISITN==AAA[i,1]&data$PARAM==BBB[j,1]) #筛选某个访视下的某检查项的数据
names(dataccc)[4]<-paste(BBB[j,1],AAA[i,1],sep = "_") #给检测值重命名为“检查项+访视号”
dataccc<-dataccc[,c(1,4)]
dataTT<-merge(dataTT,dataccc,all = T,by="SUBJID") #按唯一编号合并数据
}
}
names(dataTT) #查看拉横的数据集的变量名
write.csv(dataTT,"dataTT.csv",row.names = F,na="") #导出拉横向的数据
}
ZONGHENG(data)
上面的代码解决的是只有一个值变量(AVAL)需要重命名的情况。但是大多数时候不单单有检测值,还有单位、检测时间等变量也同样需要重命名。这时候function()需要再引入一个参数n来解决。
代码如下:
ZONGHENG<-function(data,n){ #n是第几个变量开始需要重命名
AAA<-data.frame(table(data$AVISITN))
AAA<-AAA[1] #提取访视号有几类,后面变量重命名需要
BBB<-data.frame(table(data$PARAM))
BBB<-BBB[1] #提取检查项名称有几类,后面变量重命名需要
SUBJID<-NA
dataTT<-data.frame(SUBJID) #建立一个空数据集备用
for (i in 1:length(AAA$Var1)) {
for (j in 1:length(BBB$Var1)) {
dataccc<-subset(data,data$AVISITN==AAA[i,1]&data$PARAM==BBB[j,1]) #筛选某个访视下的某检查项的数据
names(dataccc)[n]<-paste(BBB[j,1],AAA[i,1],sep = "_") #给检测值重命名为“检查项+访视号”
for (g in n+1:length(dataccc)) {
names(dataccc)[g]<-paste(BBB[j,1],AAA[i,1],names(dataccc)[g],sep = "_")
}
dataccc<-dataccc[,c(1,n:length(dataccc))] #删除访视号和检查项列
dataTT<-merge(dataTT,dataccc,all = T,by="SUBJID") #按唯一编号合并数据
}
}
names(dataTT) #查看拉横的数据集的变量名
write.csv(dataTT,"dataTT.csv",row.names = F,na="") #导出拉横向的数据
}
举例子:
data<-mydata[c("SUBJID","AVISITN","PARAM","AVAL","AVALC")] #SUBJID是唯一编号,AVISITN是访视号,PARAM是检查项,AVAL是检测值,AVALC是单位
ZONGHENG(data,4) #4,从第四个变量开始需要重命名