对于循环?通过缺少因子级别的值在数据框中包括行

时间:2017-05-30 20:30:40

标签: r loops if-statement

早上好

我有一个渔业数据的数据集,其中有几个变量如下所示:

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:

感谢您提前获得任何建议

1 个答案:

答案 0 :(得分:2)

您可以使用tidyr

首先使用tidyr::complete填写LengthClass的所有组合,并指定Count应填写为0

然后对数据进行排序并使用tidyr::fill为其他列填充相同的值(IDLengthClassCount除外)。

创建数据

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