从具有多个唯一变量的长格式转换为宽格式到 R 中的其他唯一变量
Convert from long to wide format with multiple unique variables to other unique variables in R
我正在尝试从长格式转换为宽格式,但多列表示唯一行。
在下面的示例中,block, density, species
列表示唯一个体。每个人都有 2 或 3 行与面积和大小相关联。我想将面积和大小转换为宽格式。
这是我的数据集
block <- c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2)
species <- c("A","A","A","A","B","B","B","B","A","A","A","A","B","B","B","B","B")
den <- c("20","20","50","50","20","20","50","50","20","20","50","50","20","20","50","50","50")
block <- as.factor(block)
den <- as.factor(den)
species <- as.factor(species)
area <- c(1:17)
size <- c(17:33)
df <- data.frame(block, species, den, area, size)
我想要最终数据集只包含唯一个体
block species den area.1 area.2 area.3 size.1 size.2 size.3
1 A 20 1 2 NA 17 18 NA
1 A 50 3 4 NA 19 20 NA
.....
2 B 50 15 16 17 31 32 33
注意:我所追求的其他答案不使用多列来表示行的唯一性
我们可以在按组创建序列列后使用pivot_wider
library(dplyr)
library(tidyr)
df %>%
group_by(block, species, den) %>%
mutate(rn = row_number()) %>%
ungroup %>%
pivot_wider(names_from = rn, values_from = c(area, size), names_sep = ".")
# A tibble: 8 x 9
# block species den area.1 area.2 area.3 size.1 size.2 size.3
# <fct> <fct> <fct> <int> <int> <int> <int> <int> <int>
#1 1 A 20 1 2 NA 17 18 NA
#2 1 A 50 3 4 NA 19 20 NA
#3 1 B 20 5 6 NA 21 22 NA
#4 1 B 50 7 8 NA 23 24 NA
#5 2 A 20 9 10 NA 25 26 NA
#6 2 A 50 11 12 NA 27 28 NA
#7 2 B 20 13 14 NA 29 30 NA
#8 2 B 50 15 16 17 31 32 33
我正在尝试从长格式转换为宽格式,但多列表示唯一行。
在下面的示例中,block, density, species
列表示唯一个体。每个人都有 2 或 3 行与面积和大小相关联。我想将面积和大小转换为宽格式。
这是我的数据集
block <- c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2)
species <- c("A","A","A","A","B","B","B","B","A","A","A","A","B","B","B","B","B")
den <- c("20","20","50","50","20","20","50","50","20","20","50","50","20","20","50","50","50")
block <- as.factor(block)
den <- as.factor(den)
species <- as.factor(species)
area <- c(1:17)
size <- c(17:33)
df <- data.frame(block, species, den, area, size)
我想要最终数据集只包含唯一个体
block species den area.1 area.2 area.3 size.1 size.2 size.3
1 A 20 1 2 NA 17 18 NA
1 A 50 3 4 NA 19 20 NA
.....
2 B 50 15 16 17 31 32 33
注意:我所追求的其他答案不使用多列来表示行的唯一性
我们可以在按组创建序列列后使用pivot_wider
library(dplyr)
library(tidyr)
df %>%
group_by(block, species, den) %>%
mutate(rn = row_number()) %>%
ungroup %>%
pivot_wider(names_from = rn, values_from = c(area, size), names_sep = ".")
# A tibble: 8 x 9
# block species den area.1 area.2 area.3 size.1 size.2 size.3
# <fct> <fct> <fct> <int> <int> <int> <int> <int> <int>
#1 1 A 20 1 2 NA 17 18 NA
#2 1 A 50 3 4 NA 19 20 NA
#3 1 B 20 5 6 NA 21 22 NA
#4 1 B 50 7 8 NA 23 24 NA
#5 2 A 20 9 10 NA 25 26 NA
#6 2 A 50 11 12 NA 27 28 NA
#7 2 B 20 13 14 NA 29 30 NA
#8 2 B 50 15 16 17 31 32 33