Как отсортировать порядок строк в соответствии с номером, а не символом?

#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