Порядок по максимальному значению столбца, когда его тип списка? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть следующий df.

d<- data.frame (type=c("rna","rna","rna"), value = c(1,2,3) )
d2 <- data.frame (type=c("dna","dna"), value = c(20,30) )
d3 <- data.frame (type=c("protein","protein","protein"), value = c(-9.6,300, 1000) )
df <- rbind (d,d2,d3)

df$test = list ( c(0,12), 2, 3, 4,5,6,7, c(20,1) )

     type  value  test
1     rna    1.0 0, 12
2     rna    2.0     2
3     rna    3.0     3
4     dna   20.0     4
5     dna   30.0     5
6 protein   -9.6     6
7 protein  300.0     7
8 protein 1000.0 20, 1

Что мне нравится делать, так это заказывать тест столбца от самого высокого до самого низкого.Однако, поскольку test - это список, мне нравится использовать только максимальное значение.Например, строка 1 будет отсортирована по значению 12, а строка 8 - по 20. Таким образом, если я упорядочу тест по убыванию строки 8, первая строка будет следовать строкой 2 и так далее.Я могу заказать, когда столбец числового типа, но пень, когда его список, особенно когда в каждом элементе есть несколько значений.спасибо.

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Используя tidyverse инструменты: мы можем использовать purrr::map_dbl, чтобы получить max значение столбца 'test' и использовать его в arrange(desc())

library(tidyverse)
df %>%
  arrange(desc(map_dbl(test, max)))
#      type  value  test
#1 protein 1000.0 20, 1
#2     rna    1.0 0, 12
#3 protein  300.0     7
#4 protein   -9.6     6
#5     dna   30.0     5
#6     dna   20.0     4
#7     rna    3.0     3
#8     rna    2.0     2

data

df <- structure(list(type = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L), 
 .Label = c("rna", "dna", "protein"), class = "factor"), 
 value = c(1, 2, 3, 20, 30, -9.6, 300, 1000), 
 test = list(c(0, 12), 2, 3, 4, 5, 6, 7, c(20, 1))),
  row.names = c(NA, -8L), class = "data.frame")
0 голосов
/ 07 июня 2018

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

df[order(sapply(df$test, max), decreasing=TRUE), ]

# type  value  test
# 8 protein 1000.0 20, 1
# 1     rna    1.0 0, 12
# 7 protein  300.0     7
# 6 protein   -9.6     6
# 5     dna   30.0     5
# 4     dna   20.0     4
# 3     rna    3.0     3
# 2     rna    2.0     2
0 голосов
/ 07 июня 2018

Вы можете использовать sapply(..., max), чтобы извлечь максимум из каждого вектора, а затем отсортировать по нему:

df %>% arrange(desc(sapply(test, max)))

#     type  value  test
#1 protein 1000.0 20, 1
#2     rna    1.0 0, 12
#3 protein  300.0     7
#4 protein   -9.6     6
#5     dna   30.0     5
#6     dna   20.0     4
#7     rna    3.0     3
#8     rna    2.0     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...