R: dplyr упорядочить по номеру строки - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь упорядочить набор данных в соответствии со значениями в столбцах в порядке возрастания.

У меня есть набор данных с 1 строкой и 3000+ столбцами. Я думаю, я могу просто изменить его на список и использовать .[[n]], но я подумал, есть ли другой способ.

данные выглядят примерно так только с большим количеством столбцов и значений.

structure(list(a = -0.00106163456888295, b = -4.11357273721094e-05, c = -0.000181424293930435), row.names = 1L, class = "data.frame")

Я ожидаю что-то вроде этого:

b c a 1 -4.1135727372109401e-05 -0.00018142429393043499 -0.00106163456888295

Я понимаю, что вы можете упорядочить по номеру столбца, выполнив следующее:

.[[column number]]

например: mtcars %>% arrange(.[[2]])

что эквивалентно номеру строки?

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Если я вас правильно понимаю, вы хотите упорядочить столбцы на основе значений в одной строке.

z <- structure(list(a = -0.00106163456888295, b = -4.11357273721094e-05, 
    c = -0.000181424293930435), row.names = 1L, class = "data.frame")

База R:

z[,order(z[1,])]
#                a               c                b
# 1 -0.00106163457 -0.000181424294 -0.0000411357274

Тидиверс:

library(dplyr)
z %>%
  select_at(order(.))

Примечание: я думаю, что ваш ожидаемый результат может быть неправильным, так как значения не упорядочены. Ваш предполагаемый результат:

c(-0.000181424293930435,       -0.00106163456888295,    -4.11357273721094e-05)
# [1] -0.0001814242939 -0.0010616345689 -0.0000411357274
diff(c(-0.000181424293930435,       -0.00106163456888295,    -4.11357273721094e-05))
# [1] -0.000880210275  0.001020498842

показывает, что первое значение больше второго, а второе меньше третьего. Если бы они были заказаны, я бы ожидал, что diff будет всегда неотрицательным; в обратном порядке diff должен быть всегда неположительным.

0 голосов
/ 28 марта 2020

Мы можем unlist первую строку, order и использовать это в select

library(dplyr)
df1 %>%
   select(order(-unlist(.[1,])))
#             b             c            a
#1 -4.113573e-05 -0.0001814243 -0.001061635

. Можно также использовать общее решение, т.е. если мы хотим сделать это на основе определенного строка

n <- 3
mtcars %>% 
    select(order(-unlist(.[n,])))

Или измените форму на 'long' и затем используйте arrange, получите имена столбцов и затем select

library(tidyr)
df1 %>% 
   pivot_longer(everything()) %>% 
   arrange(desc(value)) %>% 
   pull(name) %>% 
   select(df1, .)
#              b             c            a
#1 -4.113573e-05 -0.0001814243 -0.001061635

Или enframe, затем выполните arrange, pull столбец 'name' и используйте его в select

library(tibble)
as.list(df1) %>% 
     enframe %>%
     unnest(c(value)) %>%
     arrange(desc(value)) %>% 
     pull(name) %>% 
     select(df1, .)

Или, если мы хотим выбрать столбец 'c'

df1 %>%
    select(c, everything())
#             c            a             b
#1 -0.0001814243 -0.001061635 -4.113573e-05

В base R мы можем сделать

 df1[order(-unlist(df1[1,]))]

data

df1 <- structure(list(a = -0.00106163456888295, b = -4.11357273721094e-05, 
c = -0.000181424293930435), row.names = 1L, class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...