R 为每个站点排序前n个值的列名称,并在数据框中生成结果
我有一个站点(行)-物种(列)数据框架,其中包括物种的丰富度。我试图生成一个数据框架,包括R中每个站点的前n个物种。我当前的数据包括353个物种和99个站点,包括覆盖率数据。我将为我的数据应用该解决方案,但如果该解决方案可以应用于任何类似的数据(包括数百个物种和地点),那将是非常棒的 这是我的数据,它看起来如何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
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"))