按类型列表按列的最大值排序?

时间:2018-06-07 17:24:18

标签: r dplyr

我有以下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是一个列表,我喜欢做的只是使用max值。例如,第1行将使用值12进行排序,第8行将使用20进行排序。因此,如果我通过降序第8行进行测试,则第一行将跟随行第2行,依此类推。我可以在列是数字类型时进行排序,但是当列表是列表时,特别是当每个元素中有多个值时,我可以进行排序。感谢。

3 个答案:

答案 0 :(得分:3)

您可以使用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

答案 1 :(得分:2)

使用tidyverse工具:我们可以使用purrr::map_dbl获取&#39;测试&#39;的max值。列并在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

数据

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")

答案 2 :(得分:2)

在基地R我们可以做

    iptables -P INPUT ACCEPT
    iptables -P OUTPUT ACCEPT
    iptables -F
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT -p tcp -m tcp --dport 2020 -j ACCEPT
    iptables -A OUTPUT -p tcp -m tcp --sport 2020 -j ACCEPT
    iptables -P INPUT DROP
    iptables -P OUTPUT DROP