r - 将数据集转换为在 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
and dplyr
,您可以先将我们的年份列重塑为更长的格式,然后使用pivot_wider
创建“a”和“b”列,组装“site”和“ID”,最后只保留所需的列:
library(tidyr)
library(dplyr)
df %>% pivot_longer(.,-c(Species, site), names_to = "ID", values_to = "val") %>%
pivot_wider(.,names_from = Species, values_from = val) %>%
rowwise() %>%
mutate(ID = paste(site,ID, sep = "_")) %>%
select(ID, a, b)
Source: local data frame [9 x 3]
Groups: <by row>
# A tibble: 9 x 3
ID a b
<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
数据
structure(list(Species = c("a", "a", "a", "b", "b", "b"), site = c(1L,
2L, 3L, 1L, 2L, 3L), `2001` = c(0L, 1L, 5L, 3L, 1L, 4L), `2002` = c(1L,
1L, 5L, 0L, 1L, 5L), `2003` = c(4L, 0L, 5L, 4L, 1L, 5L)), row.names = c(NA,
-6L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x56276b4f1350>)
推荐阅读
- python - 如何使用另一个元组中的元素从一个元组中查找索引
- django-rest-framework - 将 Google 日历与 Django 和 allauth 集成
- c# - 如何显示成功消息然后刷新网页
- javascript - Chart.js 使 pointRadius 响应式
- c# - 如何在 c# .net 中使用 uodotnet.dll UniObjects
- azure-devops - Azure DevOps 中的构建验证管道是否需要触发器
- mysql - 在向 MySQL 表添加数据时,何时使用禁用/启用键提高性能?
- r - 从应用于两个向量的函数创建结果矩阵
- python - 如何将第一个数据框中的列与第二个数据框中的列进行比较,并在匹配时从第二个数据框中的另一列中提取值
- python-3.x - AttributeError:“ApplicantEducation”对象没有属性“_state”