我在将一些数据重组为更易消化的格式时遇到了一些麻烦。我有一个像这样的数据框(但有更多的行和列)。行是鸟类,列是森林类型:
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 :(得分:1)
您可以使用dplyr
和tidyr
执行此类操作。输出是一个长格式的'每个林的前五个物种及其相应值的数据框(请注意,如果存在平局,则可能有五个以上的条目)。
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()
library(tidyverse)
df %>%
gather(forest, value, Decid:Total) %>%
group_by(forest) %>%
arrange(forest, desc(value)) %>%
slice(1:5)