【问题标题】:For loops? Including rows in a dataframe by the missing values of factor levels对于循环?通过因子水平的缺失值包括数据框中的行
【发布时间】:2017-10-31 11:15:38
【问题描述】:

早安

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

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 列日、月、年和 Haul.number 生成的唯一 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:

提前感谢您的任何建议

【问题讨论】:

    标签: r loops if-statement


    【解决方案1】:

    您可以为此使用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
    

    【讨论】:

    • 太棒了!非常感谢您的有用回答!这让我很开心!
    • 太好了,很高兴它有帮助! (您介意接受它作为答案吗,谢谢)
    • 对不起,我最近刚接触 Stack Overflow,我不知道该怎么做!现在它被设置为我的答案!再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多