2016-08-01 3 views
0

Атрибут() в dplyr производит неверный результат.Сортировка в 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 
Смежные вопросы