Reputation: 478
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
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
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
Reputation: 102920
I guess you should try
baseline.ratio <- baseline.ratio[order(baseline.ratio$Model),]
Upvotes: 1