从每列中提取最高值以及ID

时间:2017-10-14 21:56:04

标签: r sorting for-loop

我在将一些数据重组为更易消化的格式时遇到了一些麻烦。我有一个像这样的数据框(但有更多的行和列)。行是鸟类,列是森林类型:

Species Decid Hemlock Mixed Pine Spruce Total
ACFL     0       2     0    2      0     4
AMCR     0       2     0    0      5     7
AMRE    74      18    51   40     43   226
AMRO     3       0     0    3      0     6
BAWW    16      32    27   29     22   126
BBCU     5       2     1    4      5    17

我想要做的是在R中编写一些代码,这些代码将返回一个数据框,该数据框仅显示每种森林类型中出现最多的5种。换句话说,遍历每一列,找到5个最高值,然后将它们与“Species”列中的相关值一起放入新数据框中我尝试了一些方法,包括使用head(),sort()等我以为我可以做一个循环,但我无法弄清楚如何得到它。更具体地说,我试图让循环遍历每一列,但不知道如何。我现在知道df $ i不正确,df [[i]]也不起作用。我是循环的新手,所以也许我错了。

我确信我可以通过一些过于复杂的方法得到我想要的结果,但如果有人知道任何更快的方法,我会非常感激。

3 个答案:

答案 0 :(得分:1)

您可以使用dplyrtidyr执行此类操作。输出是一个长格式的'每个林的前五个物种及其相应值的数据框(请注意,如果存在平局,则可能有五个以上的条目)。

library(dplyr)
library(tidyr)
df %>% gather(key=Forest,value=value,-Species) %>% #convert to long format
       group_by(Forest) %>% #group by forest type
       top_n(5,value) %>% #select the top five for each group
       arrange(Forest,-value) #sort by forest type and descending value

   Species  Forest value
     <chr>   <chr> <int>
 1    AMRE   Decid    74
 2    BAWW   Decid    16
 3    BBCU   Decid     5
 4    AMRO   Decid     3
 5    ACFL   Decid     0
 6    AMCR   Decid     0
 7    BAWW Hemlock    32
 8    AMRE Hemlock    18
 9    ACFL Hemlock     2
10    AMCR Hemlock     2
# ... with 23 more rows

答案 1 :(得分:1)

以下命令返回一个列表,其中包含两个列数据空间,其中包含每个林的顶级物种。您可以使用top_n更改物种的最大数量 - 我在这里使用3而不是5。

top_n <- 3
lapply(2 : 6, function(i) x[order(x[, i], decreasing=T)[1 : top_n], c(1, i)])

答案 2 :(得分:0)

这是一个版本,也使用tidyverse,但通过arrange()函数使用排序,然后使用slice()

抓取前5项
library(tidyverse)

df %>% 
   gather(forest, value, Decid:Total) %>% 
   group_by(forest) %>% 
   arrange(forest, desc(value)) %>% 
   slice(1:5)