Home > Software engineering >  reorder a 1 dimensional dataframe based on the column order of a larger dataframe (R)
reorder a 1 dimensional dataframe based on the column order of a larger dataframe (R)

Time:10-27

relevant_ods_reordered <- relevant_ods[names(cpm)]

the above seeks to reorder column names of a dataframe relevant_ods:

     Plate1_DMSO_A01 Plate1_DMSO_B01 Plate1_DMSO_C01 Plate1_Lopinavir_D01
OD595           0.431          0.4495          0.4993               0.5785
      Plate1_DMSO_E01 Plate1_DMSO_F01 Plate1_DMSO_G01 Plate1_DMSO_H01
OD595          0.5336          0.5133           0.527          0.5413
      Plate1_DMSO_C12 Plate1_DMSO_D12 Plate1_Lopinavir_E12 Plate1_DMSO_F12
OD595          0.4137          0.4274               0.5241          0.4264
      Plate1_DMSO_G12 Plate1_DMSO_H12
OD595          0.4561          0.4767

to match the order of the columns in a significantly larger dataframe:

[1] "Plate1_DMSO_A01"         "Plate1_DMSO_A12"        
 [3] "Plate1_DMSO_B01"         "Plate1_DMSO_B12"        
 [5] "Plate1_DMSO_C01"         "Plate1_DMSO_C12"        
 [7] "Plate1_DMSO_D12"         "Plate1_DMSO_E01"        
 [9] "Plate1_DMSO_F01"         "Plate1_DMSO_F12"        
 [11] "Plate1_DMSO_G01"         "Plate1_DMSO_G12"        
 [13] "Plate1_DMSO_H01"         "Plate1_DMSO_H12"        
 [15] "Plate1_Lopinavir_D01"    "Plate1_Lopinavir_E12"   
 [17] "Plate1_NS1519_22009_A02" "Plate1_NS1519_22009_A04"
 [19] "Plate1_NS1519_22009_A05" "Plate1_NS1519_22009_A06"
 [21] "Plate1_NS1519_22009_A07" "Plate1_NS1519_22009_A08"
 [23] "Plate1_NS1519_22009_A09" "Plate1_NS1519_22009_A10"
 [25] "Plate1_NS1519_22009_A11" "Plate1_NS1519_22009_B02"
 [27] "Plate1_NS1519_22009_B03" "Plate1_NS1519_22009_B04"
 [29] "Plate1_NS1519_22009_B05" "Plate1_NS1519_22009_B06"

etc.

Clearly, there is a returned

Error in `[.data.frame`(relevant_ods, names(cpm)) : 
  undefined columns selected

due to the mismatch between the numbers of columns

I have tried

relevant_ods_reordered <- relevant_ods[names(cpm),]
relevant_ods_reordered <- select(relevant_ods, names(cpm))
relevant_ods_reordered <- match(relevant_ods, names(cpm))

CodePudding user response:

With base R, you need to find the names in common. intersect is good for this and preserves the order of its first argument:

relevant_ods[intersect(names(cpm), names(relevant_ods))]

Or with dplyr, use the select helper any_of:

select(relevant_ods, any_of(names(cpm)))
  • Related