将数据集转换为R中的列和行组合的整洁格式

将数据集转换为R中的列和行组合的整洁格式,r,dplyr,tidyverse,R,Dplyr,Tidyverse,我有一个数据集,它的结构有点糟糕: Species site 2001 2002 2003 a 1 0 1 4 a 2 1 1 0 a 3 5 5 5 b 1 3 0 4 b 2 1 1 1 b 3 4 5 5 在用R尝试了几个小时

我有一个数据集,它的结构有点糟糕:

Species    site  2001  2002  2003 
a          1      0     1    4
a          2      1     1    0
a          3      5     5    5
b          1      3     0    4
b          2      1     1    1
b          3      4     5    5
在用R尝试了几个小时以正确的格式获得它之后,我在Excel中完成了它,并将它转换为下面的格式

ID       a   b
1_2001   0   3
1_2002   1   0
1_2003   4   4
2_2001   1   1
2_2002   1   1
2_2003   0   1
3_2001   5   4
3_2002   5   5
3_2004   5   5
原始的数据集相当大,我不能让它休息,我不知道如何在R中快速完成。 有人能给我解释一下如何在R中实现这一转换吗?

使用tidyr和dplyr,您可以首先将我们的年份列重塑为更长的格式,然后使用pivot_更广泛地创建a和b列,组装站点和ID,最后只保留所需的列:

图书馆三年 图书馆弹琴 df%>%pivot\u更长,-cSpecies,site,name\u to=ID,value\u to=val%>% pivot_加宽,name_from=物种,value_from=val%>% 行%>% mutateID=粘贴站点,ID,sep=\%>% selectID,a,b 来源:本地数据帧[9 x 3] 组: 一个tibble:9x3 身份证 1 1_2001 0 3 2 1_2002 1 0 3 1_2003 4 4 4 2_2001 1 1 5 2_2002 1 1 6 2_2003 0 1 7 3_2001 5 4 8 3_2002 5 5 9 3_2003 5 5 资料

structurelistSpecies=ca,a,a,b,b,b,site=c1L, 2L,3L,1L,2L,3L,`2001`=c0L,1L,5L,3L,1L,4L,`2002`=c1L, 1L,5L,0L,1L,5L,`2003`=c4L,0L,5L,4L,1L,5L,row.NAME=cNA, -6L,class=cdata.table,data.frame,.internal.selfref= 使用tidyr和dplyr,您可以首先将我们的年份列重新塑造为更长的格式,然后使用pivot_更宽的范围创建a和b列,组装站点和ID,最后只保留所需的列:

图书馆三年 图书馆弹琴 df%>%pivot\u更长,-cSpecies,site,name\u to=ID,value\u to=val%>% pivot_加宽,name_from=物种,value_from=val%>% 行%>% mutateID=粘贴站点,ID,sep=\%>% selectID,a,b 来源:本地数据帧[9 x 3] 组: 一个tibble:9x3 身份证 1 1_2001 0 3 2 1_2002 1 0 3 1_2003 4 4 4 2_2001 1 1 5 2_2002 1 1 6 2_2003 0 1 7 3_2001 5 4 8 3_2002 5 5 9 3_2003 5 5 资料

structurelistSpecies=ca,a,a,b,b,b,site=c1L, 2L,3L,1L,2L,3L,`2001`=c0L,1L,5L,3L,1L,4L,`2002`=c1L, 1L,5L,0L,1L,5L,`2003`=c4L,0L,5L,4L,1L,5L,row.NAME=cNA, -6L,class=cdata.table,data.frame,.internal.selfref=
这里是另一个从tidyr软件包收集和传播的解决方案:

输出:

# A tibble: 9 x 4
   site key       a     b
  <int> <chr> <int> <int>
1     1 2001      0     3
2     1 2002      1     0
3     1 2003      4     4
4     2 2001      1     1
5     2 2002      1     1
6     2 2003      0     1
7     3 2001      5     4
8     3 2002      5     5
9     3 2003      5     5

这里是另一个从tidyr软件包收集和传播的解决方案:

输出:

# A tibble: 9 x 4
   site key       a     b
  <int> <chr> <int> <int>
1     1 2001      0     3
2     1 2002      1     0
3     1 2003      4     4
4     2 2001      1     1
5     2 2002      1     1
6     2 2003      0     1
7     3 2001      5     4
8     3 2002      5     5
9     3 2003      5     5