2016-08-01 3 views
0

dplyrのarrange()が不正な結果を生成します。dplyrでソートすると、間違った出力が発生する

library(dplyr) 
x <- as.data.frame(cbind(name=c("A","B","C","D"), val=c(0.032, 0.077, 0.4, 0.0001))) 
x.1 <- x %>% arrange(val) 
x.2 <- x %>% arrange(desc(val)) 

出力は、次のとおり

name val 
1 A 0.032 
2 B 0.077 
3 C 0.4 
4 D 1e-04 

>x.1 
    name val 
1 A 0.032 
2 B 0.077 
3 C 0.4 
4 D 1e-04 

> x.2 
    name  val 
1 D 1e-04 
2 C 0.4 
3 B 0.077 
4 A 0.032 

両方昇順ソート誤った出力を生成降順。 私はここで間違っているのか分かりませんか? ありがとうございます。

+3

「as.data.frame(cbind())」はあなたが間違っていることです。すべてが 'cbind()'で文字に変換され、次に 'as.data.frame()'で因数分解されます。データフレームを作成するには、 'data.frame()'を使用します。それがその理由です。 –

+2

この種の問題にぶつかるときは、変数のクラスをチェックするために 'str'を使うのがよいでしょう。現在、あなたの変数は上記の理由による要因です – Sumedh

+0

@RichardScriven Reopened。それは私が投稿する答えに何度も起こります。 – akrun

答えて

3

as.data.frame(cbind())あなたが間違っていることは何ですか。 cbind()ですべてが文字に変換され、次にas.data.frame()に因数分解されます。人々は、データフレームを作成するこの方法を学んでいるところ私にはわからない

str(x) 
# 'data.frame': 4 obs. of 2 variables: 
# $ name: Factor w/ 4 levels "A","B","C","D": 1 2 3 4 
# $ val : Factor w/ 4 levels "0.032","0.077",..: 1 2 3 4 

...顔をしているが、それはひどい練習だと使用すべきではありません。

使用data.frame()データフレームを作成するには、それはそれはあります理由です(またはdplyrを使用した場合、data_frame()にもあります)。

library(dplyr) 
x <- data.frame(name=c("A","B","C","D"), val=c(0.032, 0.077, 0.4, 0.0001)) 
x.1 <- x %>% arrange(val) 
x.2 <- x %>% arrange(desc(val)) 

x.1 
# name val 
# 1 D 0.0001 
# 2 A 0.0320 
# 3 B 0.0770 
# 4 C 0.4000 

x.2 
# name val 
# 1 C 0.4000 
# 2 B 0.0770 
# 3 A 0.0320 
# 4 D 0.0001 
関連する問題