通过使用第二个数据帧作为参考对R个数据帧列进行排序。


Order R dataframe columns by using second dataframe as a reference.

我正在使用R开发统计程序,该程序接受两个dataFrames。第一个dataFrame携带患者的人口统计信息,第二个dataFrame携带他们的临床信息。人口统计数据框架中的关键列是PatientID列。在临床数据框中,每个患者ID均为一列。我希望根据临床数据框架中患者ID的(索引列)的顺序按患者ID排列/分类我的人口统计数据框架。 ID的编号也可以是数字或字母数字,也可以只是某些字母序列。我能够编写一些代码,但需要帮助/指导以提出一种更好的方式来对列进行排序,而不管它们的数据类型(字符,因子,数字等)如何。

1
2
3
4
5
6
7
8
9
10
11
12
13
demogr = read.csv(mydemoFile, header = T, stringsAsFactors      
  =TRUE,colClasses=c('factor','factor','factor','factor','factor'))

demogr=demogr[order(as.numeric(demogr$Patient_ID)),]

myClinicalFrame=fread(myInputFile,header=T,data.table=FALSE,sep=",")

rowNames=myClinicalFrame[,1]

myClinicalFrame[,1]<-NULL
rownames(myClinicalFrame)=rowNames

names(myClinicalFrame)=sort((names(myClinicalFrame)))

以上内容适用于某些类型,但不适用于其他类型。例如:中的Patient_ID
demoFrame在数字上进行了排序,在某些情况下,R会更改Patient_ID,例如
109999345554545465到1.09e 18,它与第二个dataFrame不匹配。

谢谢


让我们从创建两个示例数据帧开始:

1
2
3
4
5
6
7
8
9
patientID = c(123456789012345,1234,1234567890,123)
state = c("FL","NJ","CA","TX")
demog = data.frame(ID = patientID,state = state)

clinical = data.frame(col1 = c(1,2,3),
                      col2 = c(3,4,5),
                      col2 = c(1,7,9),
                      col2 = c(6,4,2))
colnames(clinical) = c("1234567890","123","123456789012345","1234")

这给了我们:

1
2
3
4
5
6
> demog
            ID state
1 1.234568e+14    FL
2 1.234000e+03    NJ
3 1.234568e+09    CA
4 1.230000e+02    TX

1
2
3
4
5
> clinical
  1234567890 123 123456789012345 1234
1          1   3               1    6
2          2   4               7    4
3          3   5               9    2

您可以看到demog中的行与clinical中的列的顺序不同。

要对demog中的行进行排序,请执行以下操作:

1
2
rownames(demog) = demog$ID
demog = demog[colnames(clinical),]

即使对于作为因子或字符的ID,这也适用,因为rownames()会将其转换为字符。

结果:

1
2
3
4
5
6
> demog
                          ID state
1234567890      1.234568e+09    CA
123             1.230000e+02    TX
123456789012345 1.234568e+14    FL
1234            1.234000e+03    NJ