Как я могу использовать атрибут row.names, чтобы упорядочить строки моей файловой рамки в R?

Я создал случайный лес и предсказал классы моего набора тестов, которые счастливо живут в кадре данных:

row.names   class  
564028      1
275747      1
601137      0
922930      1
481988      1
...

Атрибут row.names сообщает мне, какая строка это, перед тем как я сделал различные операции, которые скремблировали порядок строк во время процесса. Пока все хорошо.

Теперь я хотел бы получить общее представление о точности моих прогнозов. Для этого мне нужно взять этот фрейм и изменить порядок его в порядке возрастания в соответствии с атрибутом row.names. Таким образом, я могу сравнить наблюдения, по ряду причин, с метками, о которых я уже знаю.

Простите меня за задание такого основного вопроса, но для жизни я не могу найти хороший источник информации о том, как выполнить такую ​​тривиальную задачу.

Документация меня умоляет:

используйте attr(x, "row.names"), если вам нужно получить целочисленный набор имен строк.

но это оставляет меня только с NULL.

Мой вопрос: как я могу использовать row.names, который преклонялся за мной в разных воплощениях данных в течение всего моего рабочего процесса? Разве это не то, для чего оно существует?

Ответы

Ответ 1

Это сработало для меня:

new_df <- df[ order(row.names(df)), ]

Ответ 2

Ни одно из решений не будет работать. Это должно быть:

df[ order(as.numeric(row.names(df))),] #assuming фрейм данных называется df

потому что rowname в R является "символом", когда отсутствует as.numeric, он упорядочивает данные как 1, 10, 11... и так далее.

Ответ 3

Для полноты:

@BondedDust ответ отлично работает для атрибута rownames, но ваш пример не использует атрибут rownames. Результат, указанный в вашем вопросе, указывает на использование столбца с именем "row.names" , который не является тем же самым (все перечисленные в комментарии @BondedDust). Здесь был бы ответ, если бы вы хотели отсортировать столбец "row.names" в примере, указанном в вашем вопросе (есть другое сообщение на этом, расположенное здесь). Этот ответ предполагает, что вы используете dataframe с именем "df", с одним столбцом с именем "row.names" :

ordered.df <- df[order(df$row.names),]   #this orders the df by the "row.names" column

В качестве альтернативы, заказать по первому столбцу (то же самое, если вы все еще используете свой пример):

ordered.df <- df[order(df[,1]),]         #this orders the df by the first column

Надеюсь, что это будет полезно!

Ответ 4

Это будет сделано почти автоматически, так как функция "[" будет отображаться в лексическом порядке любого вектора, который может быть сопоставлен с именами ростов():

df[ rownames(df) , ]

Возможно, вы могли подумать, что необходимо использовать:

df[ order(rownames(df)) , ]

Но это дало бы вам заказ 1:100 из 1,10,100, 12,13,..., 2,20,21,..., потому что аргумент "[" принуждается к символу.

Ответ 5

Предполагая, что ваш фрейм данных называется "df'you, вы можете создать новый упорядоченный фрейм данных ord.df", который будет содержать имена строк df, а также значения в следующей строке кода:

>ord.df<-cbind(rownames(df)[order(rownames(df))], df[order(rownames(df)),])

Ответ 6

new_df <- df[ order(row.names(df)), ]  

или что-то подобное не будет работать. После этого оператора у new_df больше нет имени строки. Я думаю, что лучшее решение состоит в том, чтобы добавить столбец в качестве имени строки, отсортировать его и установить его в качестве имени строки

Ответ 7

Если у вас есть только один столбец в вашем фрейме данных, как в моем случае, вы должны добавить drop = F:

df[ order(rownames(df)) , ,drop=F]

Ответ 8

Вы можете просто отсортировать свою df используя это:

df <- df[sort(rownames(df)),]

а потом делай что хочешь!