代码之家  ›  专栏  ›  技术社区  ›  Daniel Estévez

扩展数据帧以包含不存在的值

  •  0
  • Daniel Estévez  · 技术社区  · 4 月前

    我有一个数据帧,看起来像这样:

    家庭 订购 等级 出席情况 年份 网站 地点 拉特
    蜓科 奥多纳塔 昆虫a 0 2021 KAV01 美国国家航空航天局 -17.4 18.5
    蜓科 奥多纳塔 昆虫a 0 2023 KAV01 美国国家航空航天局 -17.4 18.5
    蜓科 奥多纳塔 昆虫a 1. 2021 KAV02 美国国家航空航天局 -17.7 18.7
    蜓科 奥多纳塔 昆虫a 0 2023 KAV02 美国国家航空航天局 -17.7 18.7
    蜓科 奥多纳塔 昆虫a 0 2021 KAV03 美国国家航空航天局 -17.8 19.1
    蜓科 奥多纳塔 昆虫a 0 2023 KAV03 美国国家航空航天局 -17.8 19.1

    有许多独特的家族,我的存在值为0和1,但家族值没有完全覆盖。也就是说,并非所有族值都指定了0或1的存在值。让我进一步解释,在所有数据集中,有一个唯一的家庭数量=100,但KAV03站点的存在/不存在值为90。我想要的是确保剩下的10个家庭也在场,当然,在场值为0。随着数据的扩展,我还想保持其余变量的原样。

    我希望我解释得足够好,如果你需要更多信息,请告诉我。以下是我尝试过但失败的代码:

    MorphoData <- expand.grid(
      Site = unique(MorphoData$Site), 
      Family = unique(MorphoData$Family), 
      Year = unique(MorphoData$Year)
    ) %>%
      left_join(MorphoData, by = c("Site", "Family", "Year")) %>%
      group_by(Site, Family, Year) %>%
      mutate(
        Presence = replace_na(Presence, 0)  # Ensure missing Presence values are 0
      ) %>%
      group_by(Site, Year) %>%
      fill(everything(.), .direction = "downup") %>%  # Fill missing taxonomy/spatial data
      ungroup()
    

    以下是一个假设的例子:

    data <- data_frame(Site = c("KAV01", "KAV01", "KAV01", "KAV01", "KAV01", "KAV01", "KAV01",
                                "KAV02", "KAV02", "KAV02", "KAV02", "KAV02", "KAV02", "KAV02",
                                "KAV03", "KAV03", "KAV03", "KAV03", "KAV03", "KAV03", "KAV03"),
                       Family = sample(c("Fam1", "Fam2", "Fam3", "Fam4", "Fam5", "Fam6"), 21, replace = TRUE),
                       Year = sample(c(2021, 2022, 2023), 21, replace = TRUE),
                       Presence = sample(c(0, 1), 21, , replace = TRUE),
                       Lon = rnorm(n = 21, mean = 5, sd = 1),
                       Lat = rnorm(n = 21, mean = 2, sd = 0.3))
    

    你会发现,这些网站不会对所有家庭都有价值。我希望给定站点中未包含的家庭的存在值为0。

    非常感谢。

    1 回复  |  直到 4 月前
        1
  •  1
  •   G. Grothendieck    4 月前

    尝试 complete

    library(tidyr)
    
    complete(data, Site, Family, Year, fill = list(Presence = 0))