2016-06-27 2 views
-1

Я пытаюсь сортировать кадр данных по столбцу чисел, и вместо этого я получаю буквенно-цифровую сортировку цифр. Если кадр данных преобразуется в матрицу, сортировка работает.Сортировка кадра данных по столбцу чисел

df[order(as.numeric(df[,2])),] 

    V1 V2 
1 a 1 
3 c 10 
2 b 2 
4 d 3 

> m <- as.matrix(df) 
> m[order(as.numeric(m[,2])),] 

     V1 V2 
[1,] "a" "1" 
[2,] "b" "2" 
[3,] "d" "3" 
[4,] "c" "10" 
+2

У вас может быть столбец 'factor'. Попробуйте 'df [order (as.numeric (as.character (df [, 2]))),]' – akrun

+1

[Как сделать отличный воспроизводимый пример R?] (Http://stackoverflow.com/questions/5963269) – zx8754

+0

Вы можете проверить теорию akrun, используя всегда полезную функцию 'str'. Попробуйте на вашем data.frame и, возможно, опубликуйте отзывы. – lmo

ответ

2
V1 <- letters[1:4] 
V2 <- as.character(c(1,10,2,3)) 
df <- data.frame(V1,V2, stringsAsFactors=FALSE) 
df[order(as.numeric(df[,2])),] 

дает

V1 V2 
1 a 1 
3 c 2 
4 d 3 
2 b 10 

Но

V1 <- letters[1:4] 
V2 <- as.character(c(1,10,2,3)) 
df <- data.frame(V1,V2) 
df[order(as.numeric(df[,2])),] 

дает

V1 V2 
1 a 1 
2 b 10 
3 c 2 
4 d 3 

что обусловлено факторами.

благодаря комментаторам akrun и Imo. Проверьте каждую из двух dfs на str (df).

Кроме того, имеется более подробная информация о меню помощи функции factor(). Прокрутите вниз до «Предупреждение» для получения более подробной информации о проблеме.

-2

Edit:

Значения столбцов могут быть рассматриваются в качестве факторов.

Попробуйте заставить символ, а затем целое число.

Пример копирования и вставки из консоли:

> Foo <- data.frame('ABC' = c('a','b','c','d'),'123' = c('1','2','10','3')) 
> Foo[order(as.integer(as.character(Foo[,2]))),] 
    ABC X123 
1 a 1 
2 b 2 
4 d 3 
3 c 10 
+0

Это приводит к такому же результату. Я думаю, что это причина, по которой вы получили понижение. – scs

+0

Спасибо, я только предположил, что это сработает. Протестировал его и понял, как это сделать. Спасибо за указание на это. – ChristyCasey

1

Не могли бы вы быть немного более конкретно о том, что ваш intial dataframe? Так, запустив этот код:

df<-data.frame(c("a","b","c","d"),c(1,2,10,3)) 
colnames(df)<-c("V1","V2") 

#print(df) 

df.order<-df[order(as.numeric(df[,2])),] 

print(df.order) 

я получаю правильный ответ:

V1 V2 
1 a 1 
2 b 2 
4 d 3 
3 c 10 
Смежные вопросы