【问题标题】:Collapse duplicated rows simultaneously on several columns在几列上同时折叠重复的行
【发布时间】:2021-07-03 21:30:10
【问题描述】:

R 初学者在这里。我目前有一个数据库,其中包含超过 33 个变量,涵盖 10000 多种动物,但我遇到了一些麻烦。

总结一下,我的数据如下所示:

species1     species2    info1    info2
Parrot       Parrot      3        NA 
NA           Parrot      NA       7
Osprey       NA          NA       89
Sparrow      Sparrow     NA       19
Sparrow      NA          27       NA
NA           Duck        69       16

我在这里尝试做的是折叠或合并在物种列上有重复的行,同时保留那些具有 NA 的行。像这样的:

species1     species2    info1    info2
Parrot       Parrot      3        7
Osprey       NA          NA       89
Sparrow      Sparrow     27       19
NA           Duck        69       16

我尝试过使用group_by,但除了它仅按一个变量分组这一事实之外,我不确定它是否正确。我有 5 个其他物种行,它们也可能有重复,我应该对每个都使用这个吗?

data %>% 
  group_by(species1) %>% 
  summarise_each(funs(max))

对不起,如果这太明显了,我只是一个新手! 保护你!! :)

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以将coalesce 'species1', 'species2' 列合并为一个列,在执行summarise 之前对coalesced 列进行分组,然后使用select 将其删除

    library(dplyr)
    data %>% 
       group_by(species = coalesce(species1, species2)) %>% 
       summarise(across(everything(), ~ .[complete.cases(.)][1]))%>% 
       select(-species)
    

    -输出

    # A tibble: 4 x 4
      species1 species2 info1 info2
      <chr>    <chr>    <int> <int>
    1 <NA>     Duck        69    16
    2 Osprey   <NA>        NA    89
    3 Parrot   Parrot       3     7
    4 Sparrow  Sparrow     27    19
    

    数据

    data <- structure(list(species1 = c("Parrot", NA, "Osprey", "Sparrow", 
    "Sparrow", NA), species2 = c("Parrot", "Parrot", NA, "Sparrow", 
    NA, "Duck"), info1 = c(3L, NA, NA, NA, 27L, 69L), info2 = c(NA, 
    7L, 89L, 19L, NA, 16L)), class = "data.frame", row.names = c(NA, 
    -6L))
    

    【讨论】:

    • 感谢您的帮助!但是我还有一个问题:如果其中一个物种列的值具有不同的名称怎么办? (可以说是同义词,例如 Duck1)合并分组不会有效,对吧?在这种情况下我该怎么办?
    • @Prego coalesce 的工作方式是,如果第一个参数的对应行是 NA,它会替换为第二个参数中的非 NA。如果末尾有数字,我们可以删除带有group_by(species = stringr::str_remove(coalesce(species1, species2), "\\d+$"))的数字
    • 好吧,如果物种同义词完全不同怎么办?像野鸭和鸭子一样,我希望它保留在它们自己的物种列和同一行中
    • @Prego 这将是一个单独的问题,因为它涉及使用不同的功能。你可以发布一个新问题。谢谢
    • @Prego 通过查看帖子。我认为您可能需要一个键/值对数据集或列表,因为它非常具体,并且没有匹配它们的模式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2021-09-03
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    相关资源
    最近更新 更多