Ответ 1
Это сработало для меня:
new_df <- df[ order(row.names(df)), ]
Я создал случайный лес и предсказал классы моего набора тестов, которые счастливо живут в кадре данных:
row.names class 564028 1 275747 1 601137 0 922930 1 481988 1 ...
Атрибут row.names
сообщает мне, какая строка это, перед тем как я сделал различные операции, которые скремблировали порядок строк во время процесса. Пока все хорошо.
Теперь я хотел бы получить общее представление о точности моих прогнозов. Для этого мне нужно взять этот фрейм и изменить порядок его в порядке возрастания в соответствии с атрибутом row.names
. Таким образом, я могу сравнить наблюдения, по ряду причин, с метками, о которых я уже знаю.
Простите меня за задание такого основного вопроса, но для жизни я не могу найти хороший источник информации о том, как выполнить такую тривиальную задачу.
Документация меня умоляет:
используйте
attr(x, "row.names")
, если вам нужно получить целочисленный набор имен строк.
но это оставляет меня только с NULL
.
Мой вопрос: как я могу использовать row.names
, который преклонялся за мной в разных воплощениях данных в течение всего моего рабочего процесса? Разве это не то, для чего оно существует?
Это сработало для меня:
new_df <- df[ order(row.names(df)), ]
Ни одно из решений не будет работать. Это должно быть:
df[ order(as.numeric(row.names(df))),]
#assuming фрейм данных называется df
потому что rowname в R является "символом", когда отсутствует as.numeric, он упорядочивает данные как 1, 10, 11... и так далее.
Для полноты:
@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
Надеюсь, что это будет полезно!
Это будет сделано почти автоматически, так как функция "[" будет отображаться в лексическом порядке любого вектора, который может быть сопоставлен с именами ростов():
df[ rownames(df) , ]
Возможно, вы могли подумать, что необходимо использовать:
df[ order(rownames(df)) , ]
Но это дало бы вам заказ 1:100 из 1,10,100, 12,13,..., 2,20,21,..., потому что аргумент "[" принуждается к символу.
Предполагая, что ваш фрейм данных называется "df'you, вы можете создать новый упорядоченный фрейм данных ord.df", который будет содержать имена строк df, а также значения в следующей строке кода:
>ord.df<-cbind(rownames(df)[order(rownames(df))], df[order(rownames(df)),])
new_df <- df[ order(row.names(df)), ]
или что-то подобное не будет работать. После этого оператора у new_df
больше нет имени строки. Я думаю, что лучшее решение состоит в том, чтобы добавить столбец в качестве имени строки, отсортировать его и установить его в качестве имени строки
Если у вас есть только один столбец в вашем фрейме данных, как в моем случае, вы должны добавить drop = F:
df[ order(rownames(df)) , ,drop=F]
Вы можете просто отсортировать свою df используя это:
df <- df[sort(rownames(df)),]
а потом делай что хочешь!