Maral Dorri
Maral Dorri

Reputation: 478

Changing column to factor changes the string in the column

I have the dataframe below:

> print(baseline.ratio)
                     Model Girder 1 Girder 2 Girder 3 Girder 4 Girder 5
1   UG-124 with 9' spacing    1.997    1.789    1.053    1.772    2.017
2   UG-116 with 9' spacing    1.945    1.809    1.060    1.786    1.947
3    UG-84 with 9' spacing    1.934    1.803    1.052    1.757    1.911
4   UG-100 with 9' spacing    1.925    1.826    1.067    1.792    1.913
5    UG-92 with 9' spacing    1.923    1.833    1.070    1.796    1.909
6   UG-108 with 9' spacing    1.908    1.804    1.059    1.776    1.910
7  UG-124 with 12' spacing    2.158    2.037    1.050    1.907    1.936
8  UG-116 with 12' spacing    2.137    2.025    1.044    1.892    1.916
9  UG-108 with 12' spacing    2.122    2.019    1.041    1.881    1.901
10  UG-92 with 12' spacing    2.114    2.012    1.034    1.870    1.888
11 UG-100 with 12' spacing    2.102    2.024    1.042    1.884    1.880
12  UG-84 with 12' spacing    2.099    1.992    1.021    1.850    1.870
13 UG-124 with 15' spacing    2.354    2.184    1.034    2.014    1.971
14 UG-116 with 15' spacing    2.343    2.170    1.030    2.001    1.952
15  UG-92 with 15' spacing    2.312    2.145    1.025    1.977    1.909
16 UG-100 with 15' spacing    2.310    2.144    1.024    1.976    1.912
17 UG-108 with 15' spacing    2.310    2.139    1.019    1.970    1.916
18  UG-84 with 15' spacing    2.296    2.123    1.017    1.955    1.884

I want to sort the dataframe based on the Model column in the order of :

c("UG-84 with 9' spacing","UG-84 with 12' spacing","UG-84 with 15' spacing",
  "UG-92 with 9' spacing","UG-92 with 12' spacing","UG-92 with 15' spacing",
  "UG-100 with 9' spacing","UG-100 with 12' spacing","UG-100 with 15' spacing",
  "UG-108 with 9' spacing","UG-108 with 12' spacing","UG-108 with 15' spacing",
  "UG-116 with 9' spacing","UG-116 with 12' spacing","UG-116 with 15' spacing",
  "UG-124 with 9' spacing","UG-124 with 12' spacing","UG-124 with 15' spacing")

When I try to set it as a factor, it changes the result:

baseline.ratio$Model <- factor(baseline.ratio$Model, levels = 
                                 c("UG-84 with 9' spacing","UG-84 with 12' spacing","UG-84 with 15' spacing",
                                   "UG-92 with 9' spacing","UG-92 with 12' spacing","UG-92 with 15' spacing",
                                   "UG-100 with 9' spacing","UG-100 with 12' spacing","UG-100 with 15' spacing",
                                   "UG-108 with 9' spacing","UG-108 with 12' spacing","UG-108 with 15' spacing",
                                   "UG-116 with 9' spacing","UG-116 with 12' spacing","UG-116 with 15' spacing",
                                   "UG-124 with 9' spacing","UG-124 with 12' spacing","UG-124 with 15' spacing"))
baseline.ratio$Model <- baseline.ratio$Model[order(baseline.ratio$Model)]

Giving me the wrong dataframe:

> print(baseline.ratio)
                     Model Girder 1 Girder 2 Girder 3 Girder 4 Girder 5
1    UG-84 with 9' spacing    1.997    1.789    1.053    1.772    2.017
2    UG-84 with 9' spacing    1.945    1.809    1.060    1.786    1.947
3   UG-84 with 12' spacing    1.934    1.803    1.052    1.757    1.911
4   UG-84 with 12' spacing    1.925    1.826    1.067    1.792    1.913
5   UG-84 with 15' spacing    1.923    1.833    1.070    1.796    1.909
6   UG-84 with 15' spacing    1.908    1.804    1.059    1.776    1.910
7    UG-92 with 9' spacing    2.158    2.037    1.050    1.907    1.936
8    UG-92 with 9' spacing    2.137    2.025    1.044    1.892    1.916
9   UG-92 with 12' spacing    2.122    2.019    1.041    1.881    1.901
10  UG-92 with 12' spacing    2.114    2.012    1.034    1.870    1.888
11  UG-92 with 15' spacing    2.102    2.024    1.042    1.884    1.880
12  UG-92 with 15' spacing    2.099    1.992    1.021    1.850    1.870
13  UG-100 with 9' spacing    2.354    2.184    1.034    2.014    1.971
14  UG-100 with 9' spacing    2.343    2.170    1.030    2.001    1.952
15 UG-100 with 12' spacing    2.312    2.145    1.025    1.977    1.909
16 UG-100 with 12' spacing    2.310    2.144    1.024    1.976    1.912
17 UG-100 with 15' spacing    2.310    2.139    1.019    1.970    1.916
18 UG-100 with 15' spacing    2.296    2.123    1.017    1.955    1.884

I am not sure how to order the rows of the dataframe in the order that is defined by the given vector without changing the actual string of characters in column Model of the dataframe.

Upvotes: 0

Views: 33

Answers (3)

Duck
Duck

Reputation: 39613

Try formating the ordered factor to numeric like this:

#Values for order
v1 <- c("UG-84 with 9' spacing","UG-84 with 12' spacing","UG-84 with 15' spacing",
  "UG-92 with 9' spacing","UG-92 with 12' spacing","UG-92 with 15' spacing",
  "UG-100 with 9' spacing","UG-100 with 12' spacing","UG-100 with 15' spacing",
  "UG-108 with 9' spacing","UG-108 with 12' spacing","UG-108 with 15' spacing",
  "UG-116 with 9' spacing","UG-116 with 12' spacing","UG-116 with 15' spacing",
  "UG-124 with 9' spacing","UG-124 with 12' spacing","UG-124 with 15' spacing")
#Create a factor for order
df$Model2 <- factor(df$Model,levels = v1,ordered = T)
#Order
df2 <- df[order(as.numeric(df$Model2)),]
df2$Model2 <- NULL

Output:

df2
                     Model Girder.1 Girder.2 Girder.3 Girder.4 Girder.5
3    UG-84 with 9' spacing    1.934    1.803    1.052    1.757    1.911
12  UG-84 with 12' spacing    2.099    1.992    1.021    1.850    1.870
18  UG-84 with 15' spacing    2.296    2.123    1.017    1.955    1.884
5    UG-92 with 9' spacing    1.923    1.833    1.070    1.796    1.909
10  UG-92 with 12' spacing    2.114    2.012    1.034    1.870    1.888
15  UG-92 with 15' spacing    2.312    2.145    1.025    1.977    1.909
4   UG-100 with 9' spacing    1.925    1.826    1.067    1.792    1.913
11 UG-100 with 12' spacing    2.102    2.024    1.042    1.884    1.880
16 UG-100 with 15' spacing    2.310    2.144    1.024    1.976    1.912
6   UG-108 with 9' spacing    1.908    1.804    1.059    1.776    1.910
9  UG-108 with 12' spacing    2.122    2.019    1.041    1.881    1.901
17 UG-108 with 15' spacing    2.310    2.139    1.019    1.970    1.916
2   UG-116 with 9' spacing    1.945    1.809    1.060    1.786    1.947
8  UG-116 with 12' spacing    2.137    2.025    1.044    1.892    1.916
14 UG-116 with 15' spacing    2.343    2.170    1.030    2.001    1.952
1   UG-124 with 9' spacing    1.997    1.789    1.053    1.772    2.017
7  UG-124 with 12' spacing    2.158    2.037    1.050    1.907    1.936
13 UG-124 with 15' spacing    2.354    2.184    1.034    2.014    1.971

Upvotes: 1

Ronak Shah
Ronak Shah

Reputation: 389325

You could create a vector in the required order

vec <- c("UG-84 with 9' spacing","UG-84 with 12' spacing","UG-84 with 15' spacing",
  "UG-92 with 9' spacing","UG-92 with 12' spacing","UG-92 with 15' spacing",
  "UG-100 with 9' spacing","UG-100 with 12' spacing","UG-100 with 15' spacing",
  "UG-108 with 9' spacing","UG-108 with 12' spacing","UG-108 with 15' spacing",
  "UG-116 with 9' spacing","UG-116 with 12' spacing","UG-116 with 15' spacing",
  "UG-124 with 9' spacing","UG-124 with 12' spacing","UG-124 with 15' spacing")

The use match and order.

baseline.ratio <- baseline.ratio[order(match(baseline.ratio$Model, vec)), ]

Upvotes: 1

ThomasIsCoding
ThomasIsCoding

Reputation: 102920

I guess you should try

baseline.ratio <- baseline.ratio[order(baseline.ratio$Model),]

Upvotes: 1

Related Questions