#r
Вопрос:
Я хочу отсортировать порядок строк фрейма данных по номеру, а не по символу. Мои индексы строк для моего фрейма данных являются числовыми с порядком 1,10,11,12,2,20,21,22
и т. Д. Я order()
пытался отсортировать 1,2,3,4,5,6,7,8,9,10
индексы строк по и т. Д. , Но мои индексы строк остались прежними.
Итак, мой фрейм данных содержит 1 столбец с 11 строками:
structure(list(`colSums(fake_with_noise_boundary)` = c(-3405, 2304,
-4096, 474, -2089, -3921, -2590, 1605, 1317, 2804, 2934)),
row.names = c("1", "10", "11", "12", "2", "20", "21", "3", "30", "31" ,
"40"), class = "data.frame")
Комментарии:
1. можете ли вы добавить
dput(your_data)
выходные данные, чтобы мы могли обсудить это ?2. Если это на самом деле строки, а не просто цифры, тогда
order(as.integer(x))
. Ваше упоминание «индексов строк» кажется странным, не может действительно помочь, не зная больше о ваших данных. Я «поддерживаю» просьбуdput(your_data)
.3. Имеет ли мое редактирование больше смысла?
4. Я также хочу, чтобы соответствующие значения строк изменялись в соответствии с изменением номера строки
Ответ №1:
rownames
всегда хранятся в виде символов, если вы хотите отсортировать их в соответствии с их числовым значением, вы можете изменить его на числовое и order
.
df <- df[order(as.numeric(rownames(df))), , drop = FALSE]
df
# colSums(fake_with_noise_boundary)
#1 -3405
#2 -2089
#3 1605
#10 2304
#11 -4096
#12 474
#20 -3921
#21 -2590
#30 1317
#31 2804
#40 2934
Комментарии:
1. Что делать , если мое имя строки начинается с таких символов, как
_
, и мои имена строк имеют следующий порядок:c("_1.1", "_2.1","_1.5")
?2. В этом случае вы можете использовать
df <- df[order(readr::parse_number(rownames(df))), , drop = FALSE]
Ответ №2:
library(tidyverse)
df <-
structure(list(`colSums(fake_with_noise_boundary)` = c(-3405, 2304,
-4096, 474, -2089, -3921, -2590, 1605, 1317, 2804, 2934)),
row.names = c("1", "10", "11", "12", "2", "20", "21", "3", "30", "31" ,
"40"), class = "data.frame")
df %>%
#Create a column with your rowname
rownames_to_column() %>%
#Transform rowname to numeric
mutate(rowname = as.numeric(rowname)) %>%
# Sort row order by rowname
arrange(rowname)
rowname colSums(fake_with_noise_boundary)
1 1 -3405
2 2 -2089
3 3 1605
4 10 2304
5 11 -4096
6 12 474
7 20 -3921
8 21 -2590
9 30 1317
10 31 2804
11 40 2934