R 为每个站点排序前n个值的列名称,并在数据框中生成结果

R 为每个站点排序前n个值的列名称,并在数据框中生成结果,r,dataframe,dplyr,data-manipulation,R,Dataframe,Dplyr,Data Manipulation,我有一个站点(行)-物种(列)数据框架,其中包括物种的丰富度。我试图生成一个数据框架,包括R中每个站点的前n个物种。我当前的数据包括353个物种和99个站点,包括覆盖率数据。我将为我的数据应用该解决方案,但如果该解决方案可以应用于任何类似的数据(包括数百个物种和地点),那将是非常棒的 这是我的数据,它看起来如何 sp1 sp2 sp3 sp4 sp5 sp6 sp7 sp8 sp9 sp10 site1 0 6 1 25 0 0 2 3 40 15

我有一个站点(行)-物种(列)数据框架,其中包括物种的丰富度。我试图生成一个数据框架,包括R中每个站点的前n个物种。我当前的数据包括353个物种和99个站点,包括覆盖率数据。我将为我的数据应用该解决方案,但如果该解决方案可以应用于任何类似的数据(包括数百个物种和地点),那将是非常棒的

这是我的数据,它看起来如何

      sp1 sp2 sp3 sp4 sp5 sp6 sp7 sp8 sp9 sp10
site1  0   6   1   25  0   0   2   3  40   15 
site2  0   1   2   1   0   60  0   0   0   30
site3  15  7   0   10  0   0   55  0   0   0.5
site4  1   1   4   0   2   0   0   80  0   0
site5  0   0   58  0   1   1   2   1   3   0

我想生成一个数据框架,其中包括每个站点的前n个物种(此处为前3个物种)


谢谢大家!

试试这个。您可以先将行名设置为站点,然后将数据重塑为long。这里的关键是排列这些值,然后提取我在本例中使用的前三个
row\u number()
。之后,您可以组合由
分隔的值,并创建一个变量,以便将其重新调整为宽。完成此操作后,可以使用
separate_rows()
达到预期的结构。代码如下:

library(tidyverse)
#Code
newdf <- df %>% rownames_to_column('site') %>%
  pivot_longer(-site) %>%
  arrange(site,desc(value)) %>%
  group_by(site) %>%
  filter(row_number()<=3) %>%
  mutate(Var=paste0('V',row_number()),
         value=as.character(value),
         content=paste0(name,',',value)) %>% select(-c(name,value)) %>%
  pivot_wider(names_from = Var,values_from=content) %>%
  separate_rows(c(V1,V2,V3),sep=',')
库(tidyverse)
#代码
newdf%rownames\u to\u列('site')%>%
枢轴_更长(-site)%>%
排列(站点,描述(值))%>%
分组依据(站点)%>%
过滤器(行号()%
变异(Var=paste0('V',行号()),
值=作为字符(值),
内容=粘贴0(名称,,,值))%%>%select(-c(名称,值))%%>%
透视图(名称从=Var,值从=content)%>%
单独的_行(c(V1,V2,V3),sep=',')
输出:

# A tibble: 10 x 4
# Groups:   site [5]
   site  V1    V2    V3   
   <chr> <chr> <chr> <chr>
 1 site1 sp9   sp4   sp10 
 2 site1 40    25    15   
 3 site2 sp6   sp10  sp3  
 4 site2 60    30    2    
 5 site3 sp7   sp1   sp4  
 6 site3 55    15    10   
 7 site4 sp8   sp3   sp5  
 8 site4 80    4     2    
 9 site5 sp3   sp9   sp7  
10 site5 58    3     2   
#一个tible:10 x 4
#组别:网站[5]
站点V1 V2 V3
1站点1 sp9 sp4 sp10
2地点1402515
3站点2 sp6 sp10 sp3
4地点2 60 30 2
5站点3 sp7 sp1 sp4
6地点3 55 15 10
7站点4 sp8 sp3 sp5
8地点4 80 4 2
9站点5 sp3 sp9 sp7
10地点5 58 3 2
使用的一些数据:

#Data
df <- structure(list(sp1 = c(0L, 0L, 15L, 1L, 0L), sp2 = c(6L, 1L, 
7L, 1L, 0L), sp3 = c(1L, 2L, 0L, 4L, 58L), sp4 = c(25L, 1L, 10L, 
0L, 0L), sp5 = c(0L, 0L, 0L, 2L, 1L), sp6 = c(0L, 60L, 0L, 0L, 
1L), sp7 = c(2L, 0L, 55L, 0L, 2L), sp8 = c(3L, 0L, 0L, 80L, 1L
), sp9 = c(40L, 0L, 0L, 0L, 3L), sp10 = c(15, 30, 0.5, 0, 0)), class = "data.frame", row.names = c("site1", 
"site2", "site3", "site4", "site5"))
#数据
df
#Data
df <- structure(list(sp1 = c(0L, 0L, 15L, 1L, 0L), sp2 = c(6L, 1L, 
7L, 1L, 0L), sp3 = c(1L, 2L, 0L, 4L, 58L), sp4 = c(25L, 1L, 10L, 
0L, 0L), sp5 = c(0L, 0L, 0L, 2L, 1L), sp6 = c(0L, 60L, 0L, 0L, 
1L), sp7 = c(2L, 0L, 55L, 0L, 2L), sp8 = c(3L, 0L, 0L, 80L, 1L
), sp9 = c(40L, 0L, 0L, 0L, 3L), sp10 = c(15, 30, 0.5, 0, 0)), class = "data.frame", row.names = c("site1", 
"site2", "site3", "site4", "site5"))