早上好
我有一个渔业数据的数据集,其中有几个变量如下所示:
ID Day Month Year Depth Haul number Count LengthClass
H111200840 11 1 2008 -80 40 4 10-20
H111200840 11 1 2008 -80 40 15 20-30
H29320105 29 3 2010 -40 5 3 50-60
H29320105 29 3 2010 -40 5 8 60-70
列ID是由paste
列日,月,年和纬度数字组成的唯一ID。正如您所看到的相同ID我有不同长度类的数据。在每个运输中,捕获不同长度的鱼。
但是,LengthClass是一个因子变量,具有以下级别:10-20,20-30,30-40,40-50和未在Haul中捕获的特定长度类的鱼未记录在数据集中
我需要在上面的data.frame示例中包含每个ID的新行,并且缺少LengthClass的级别。
缺少的Length类的Count应为0,但其余变量必须相同。
这是我想要的一个例子
ID Day Month Year Depth Haul number Count LengthClass
H111200840 11 1 2008 -80 40 4 10-20
H111200840 11 1 2008 -80 40 15 20-30
H111200840 11 1 2008 -80 40 0 30-40
H111200840 11 1 2008 -80 40 0 40-50
H111200840 11 1 2008 -80 40 0 50-60
H29320105 29 3 2010 -40 5 3 40-60
H29320105 29 3 2010 -40 5 8 50-60
H29320105 29 3 2010 -40 5 0 10-20
H29320105 29 3 2010 -40 5 0 20-30
H29320105 29 3 2010 -40 5 0 30-40
无论如何在R中这样做?我已尝试使用if参数进行循环,但没有运气和also the example of this post:
感谢您提前获得任何建议
答案 0 :(得分:2)
您可以使用tidyr
。
首先使用tidyr::complete
填写LengthClass
的所有组合,并指定Count
应填写为0
。
然后对数据进行排序并使用tidyr::fill
为其他列填充相同的值(ID
,LengthClass
和Count
除外)。
library(tidyr)
library(dplyr)
df <- readr::read_csv(
'ID,Day,Month,Year,Depth,Haul_number,Count,LengthClass
H111200840,11,1,2008,-80,40,4,10-20
H111200840,11,1,2008,-80,40,15,20-30
H29320105,29,3,2010,-40,5,3,50-60
H29320105,29,3,2010,-40,5,8,60-70') %>%
mutate(LengthClass = as.factor(LengthClass))
df
#> # A tibble: 4 x 8
#> ID Day Month Year Depth Haul_number Count LengthClass
#> <chr> <int> <int> <int> <int> <int> <int> <fctr>
#> 1 H111200840 11 1 2008 -80 40 4 10-20
#> 2 H111200840 11 1 2008 -80 40 15 20-30
#> 3 H29320105 29 3 2010 -40 5 3 50-60
#> 4 H29320105 29 3 2010 -40 5 8 60-70
df %>%
group_by(ID) %>%
complete(LengthClass, fill = list(Count = 0)) %>%
arrange(ID, Day) %>%
fill(-ID, -LengthClass, -Count, .direction = "down") %>%
ungroup()
#> # A tibble: 8 x 8
#> ID LengthClass Day Month Year Depth Haul_number Count
#> <chr> <fctr> <int> <int> <int> <int> <int> <dbl>
#> 1 H111200840 10-20 11 1 2008 -80 40 4
#> 2 H111200840 20-30 11 1 2008 -80 40 15
#> 3 H111200840 50-60 11 1 2008 -80 40 0
#> 4 H111200840 60-70 11 1 2008 -80 40 0
#> 5 H29320105 50-60 29 3 2010 -40 5 3
#> 6 H29320105 60-70 29 3 2010 -40 5 8
#> 7 H29320105 10-20 29 3 2010 -40 5 0
#> 8 H29320105 20-30 29 3 2010 -40 5 0