2016-08-01 63 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重新打开它。它发生了很多次,我发布的答案也是如此。 – 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