2017-10-14 71 views
1

我在将某些数据重构为更易消化的格式方面遇到了一些麻烦。我有这样的数据框(但有更多的行和列)。该行是鸟类中,列有森林类型:从每列中提取最高值以及ID

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]]也不起作用。我是新来的循环,所以也许我一切都错了。

我相信我能得到我通过一些过于令人费解的方法想要的结果,但如果任何人任何更快的方法知道我是非常赞赏。

+0

你想同时'Species'和每列的值? –

回答

1

你可以用dplyrtidyr这样做。输出是与顶部5种用于每个森林和它们相应的值a“长格式”的数据帧(请注意,可以存在多于五个条目如果出现平局)。

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

继回报包含包含每个森林顶部种两列的数据空间项目的列表。您可以使用top_n改变物种上面的数字 - 我用3在这里,而不是5

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

修正了它。谢谢。 – Suren

0

这里有一个版本也采用tidyverse但使用通过arrange()功能分类,然后用slice()

抓住了前5项
library(tidyverse) 

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