2016-02-01 95 views
1

我有這樣排序基於包含字母加數字中的R

Day <- c("Day1","Day20","Day5","Day10") 
A <- c (5,7,2,0) 
B <- c(15,12,16,30) 

df <- data.frame(Day,A,B) 

df$Day <- as.character(df$Day) 

第一列中的數據幀的字符列一個數據幀是一個字符,所以我用this solution排序這個數據幀,但並不完全得到它是正確的,因爲這隻對第一列進行排序並且不改變列。

df$Day <- df$Day[order(nchar(df$Day), df$Day)] 

我期望的輸出是

Day A B 
Day1 5 15 
Day5 2 16 
Day10 0 30 
Day20 7 12 

缺少什麼我在這裏?請提供一些輸入。

+0

試試這個:'DF < - DF [順序(NCHAR(DF $日)),]'。或者,如果你不想按長度排序,只需'df < - df [order(df $ Day),]''。這是串排序。如果你想要一個不同的順序,最好用該列的數字組件進行排序。 – Gopala

+0

不對。 Day20在Day10之前。 – Sharath

+0

就像我說的,你不能使用字符串來排序和期望數字排序。 – Gopala

回答

2

您可以嘗試使用這樣的事情,做數字天排序:

Day <- c("Day1","Day20","Day5","Day10") 
A <- c (5,7,2,0) 
B <- c(15,12,16,30) 
df <- data.frame(Day,A,B, stringsAsFactors = FALSE) 

df$DayNum <- as.numeric(gsub('Day', '', df$Day)) 
df <- df[order(df$DayNum), ] 

輸出如下:

df 
    Day A B DayNum 
1 Day1 5 15  1 
3 Day5 2 16  5 
4 Day10 0 30  10 
2 Day20 7 12  20 

您可以避免通過執行以下操作(試圖創建一個新列顯示所發生的事情的全部細節):

df <- df[order(as.numeric(substr(df$Day, 4, nchar(df$Day)))), ] 

輸出將與上述相同。

+0

是的。完善。你告訴我後,我正試圖解決。感謝您發佈此信息。如此優雅地完成。我只是將它應用到了我擁有的更快的數據集。 – Sharath

+0

我更新了一行,避免添加一列。希望有所幫助。 – Gopala

0
Day <- c("Day1","Day20","Day5","Day10") 
A <- c (5,7,2,0) 
B <- c(15,12,16,30) 
df <- data.frame(Day,A,B, stringsAsFactors = FALSE) 

# add leading zero(s) to digits in values of Day column, 
# e.g., "Day5" --> "Day05" 
# then return the indices of the sorted vector 
indices_to_sort_by <- sort(
    sub(
     pattern = "([a-z]{1})([1-9]{1}$)", 
     replacement = "\\10\\2", 
     x = df$Day 
    ), 
    index.return = TRUE)$ix 

df[indices_to_sort_by, ] 
#  Day A B 
# 1 Day1 5 15 
# 3 Day5 2 16 
# 4 Day10 0 30 
# 2 Day20 7 12 
1

這可能與mixedorder完成從library(gtools)

library(gtools) 
df[mixedorder(df$Day),] 
# Day A B 
#1 Day1 5 15 
#3 Day5 2 16 
#4 Day10 0 30 
#2 Day20 7 12