2016-05-01 108 views
1

爲什麼dplyr在數字和字母字符組成的情況下不能正確排序第一列?R dplyr列與字母數字字符排序

> library(dplyr) 
> y <- read.table("file.csv", sep = ",") 
> arrange(y, V1) 
    V1   V2   V3   V4   V5   V6 
1 1 0.97348999 0.11047091 0.95841014 0.61826620 0.43164420 
2 10 0.82178167 0.21619067 0.11993356 0.06335101 0.28703842 
3 11 0.35952632 0.27595845 0.24760335 0.63887200 0.47491472 
4 12 0.43775624 0.08852486 0.06870304 0.63670202 0.55432641 
5 13 0.83894086 0.40484966 0.96735507 0.86764578 0.02588688 
6 14 0.95258399 0.65029909 0.97183605 0.87688243 0.97729517 
7 15 0.62839615 0.52999000 0.05722874 0.40709867 0.56039580 
8 2 0.22754619 0.16812359 0.39432991 0.68562992 0.43066861 
9 3 0.33318220 0.21108688 0.60911213 0.64475379 0.98617404 
10 4 0.57208511 0.58709229 0.29435093 0.78603855 0.81185551 
11 5 0.35548490 0.15229426 0.42423263 0.72963238 0.044
12 6 0.08575802 0.33310521 0.09671737 0.90820671 0.33289880 
13 7 0.05743798 0.20439928 0.56411860 0.54859270 0.81053637 
14 8 0.99056584 0.29960046 0.20765701 0.45722997 0.51354034 
15 9 0.35839568 0.11667019 0.56498996 0.43971051 0.23968955 
16 A 0.25645249 0.07045102 0.17046681 0.75700118 0.50269449 
17 B 0.57722865 0.31544398 0.33129932 0.44173772 0.11600295 
18 C 0.94242373 0.55745376 0.01542128 0.01723924 0.11413310 

我想看到的:

V1   V2   V3   V4   V5   V6 
1 1 0.97348999 0.11047091 0.95841014 0.61826620 0.43164420 
2 2 0.22754619 0.16812359 0.39432991 0.68562992 0.43066861 
3 3 0.33318220 0.21108688 0.60911213 0.64475379 0.98617404 
4 4 0.57208511 0.58709229 0.29435093 0.78603855 0.81185551 
5 5 0.35548490 0.15229426 0.42423263 0.72963238 0.044
6 6 0.08575802 0.33310521 0.09671737 0.90820671 0.33289880 
7 7 0.05743798 0.20439928 0.56411860 0.54859270 0.81053637 
8 8 0.99056584 0.29960046 0.20765701 0.45722997 0.51354034 
9 9 0.35839568 0.11667019 0.56498996 0.43971051 0.23968955 
10 10 0.82178167 0.21619067 0.11993356 0.06335101 0.28703842 
11 11 0.35952632 0.27595845 0.24760335 0.63887200 0.47491472 
12 12 0.43775624 0.08852486 0.06870304 0.63670202 0.55432641 
13 13 0.83894086 0.40484966 0.96735507 0.86764578 0.02588688 
14 14 0.95258399 0.65029909 0.97183605 0.87688243 0.97729517 
15 15 0.62839615 0.52999000 0.05722874 0.40709867 0.56039580 
16 A 0.25645249 0.07045102 0.17046681 0.75700118 0.50269449 
17 B 0.57722865 0.31544398 0.33129932 0.44173772 0.11600295 
18 C 0.94242373 0.55745376 0.01542128 0.01723924 0.11413310 
+0

@RichardScriven我可以做的是編輯/概括我的問題,包括任何類型的庫,而不僅僅是'dplyr'。我個人更喜歡'dplyr',但是使用任何庫的任何答案都可以正常工作。 – warship

+0

沿着同樣的路線,你如何提出它完成了這種排序?如果是數字,則按數字排序,否則按字母順序排序。不幸的是,'charToRaw(「1」) r2evans

+0

@ r2evans也許可以先對數字進行排序,然後再對字母進行排序,瞧? – warship

回答

5

你阿爾法的漠視是有點問題,但如何:

library(dplyr) 
arrange(y, as.numeric(V1)) 
# Warning in order(as.numeric(y$V1)) : NAs introduced by coercion 
# V1   V2   V3   V4   V5   V6 
# 1 1 0.97348999 0.11047091 0.95841014 0.61826620 0.43164420 
# 8 2 0.22754619 0.16812359 0.39432991 0.68562992 0.43066861 
# 9 3 0.33318220 0.21108688 0.60911213 0.64475379 0.98617404 
# 10 4 0.57208511 0.58709229 0.29435093 0.78603855 0.81185551 
# 11 5 0.35548490 0.15229426 0.42423263 0.72963238 0.044
# 12 6 0.08575802 0.33310521 0.09671737 0.90820671 0.33289880 
# 13 7 0.05743798 0.20439928 0.56411860 0.54859270 0.81053637 
# 14 8 0.99056584 0.29960046 0.20765701 0.45722997 0.51354034 
# 15 9 0.35839568 0.11667019 0.56498996 0.43971051 0.23968955 
# 2 10 0.82178167 0.21619067 0.11993356 0.06335101 0.28703842 
# 3 11 0.35952632 0.27595845 0.24760335 0.63887200 0.47491472 
# 4 12 0.43775624 0.08852486 0.06870304 0.63670202 0.55432641 
# 5 13 0.83894086 0.40484966 0.96735507 0.86764578 0.02588688 
# 6 14 0.95258399 0.65029909 0.97183605 0.87688243 0.97729517 
# 7 15 0.62839615 0.52999000 0.05722874 0.40709867 0.56039580 
# 16 A 0.25645249 0.07045102 0.17046681 0.75700118 0.50269449 
# 17 B 0.57722865 0.31544398 0.33129932 0.44173772 0.11600295 
# 18 C 0.94242373 0.55745376 0.01542128 0.01723924 0.11413310 

這也適用於含底座:

y[ order(as.numeric(y$V1)), ] 

Ed它:OP然後問(deSpite!有說「我真的不在乎」;-)如何排序非數字字段。

第一條命令的工作原理是將非數字字段全部轉換爲NA,方便地將後面的數字排列在之後。那麼,dplyr::arrangebase::order都會採用任意參數,第一列中的關係由第二個參數處理,等等。因此,爲了在NA(非數字V1元素)之間進行排序,只需添加一些有意義的內容他們,如......「他們」:

arrange(y, as.numeric(V1), V1) 
y[ order(as.numeric(y$V1), y$V1), ] 
+0

爲了清楚起見,因爲所有非「0-9」字符串都轉換爲「NA」,它們都會在data.frame的末尾被轉儲,可能原來的順序是完整的(但沒有其他順序保證)。 – r2evans

+0

呵呵,不敢相信那個工作 –

+0

是的,我也有點驚訝。 \ *聳肩\ * – r2evans