【问题标题】:How to replace a variable with a variable from preceding column [duplicate]如何用前一列中的变量替换变量[重复]
【发布时间】:2021-06-24 11:57:26
【问题描述】:

我有一个这样的数据框:

Family Genus Species
Gemmatimonadaceae Roseisolibacter Roseisolibacter_agri
Bacillaceae Bacillus NA
Blastocatellaceae NA NA

我想修改如下:

Family Genus Species
Gemmatimonadaceae Roseisolibacter Roseisolibacter_agri
Bacillaceae Bacillus Unclassified Bacillus
Blastocatellaceae Unclassified Blastocallaceae Unclassified Blastocallaceae

我试图这样做:

 replace_na(
  list(Genus = paste("Unclassified",  Family),
       Species = paste("Unclassified",  Genus)))

或使用

 replace_na(
  list(Genus = paste("Unclassified",  vars(Family)),
       Species = paste("Unclassified",  vars(Genus))))

但在这两种情况下,我最终都会得到“未分类的属”或“未分类的~属”。

我怎样才能让它从以前的已知变量继承?

我也想过使用fill(),但它只适用于整洁的数据。当然,我可以转置 data.frame,但必须有一个更优雅/简单的解决方案!

【问题讨论】:

  • “我可以转置data.frame,但必须有一个更优雅/简单的解决方案!”:有人会说整洁的解决方案优雅的解决方案! ;=) 但是在这里,因为您使用的是同一行中的数据,所以我认为您当前的格式是可以使用的。
  • 我想让它整洁,但我用于分析的主要包是 phyloseq,这个数据框是按行导入的:|
  • taxonomyTable-class {phyloseq} R 文档 将分类数据作为字符矩阵保存的 S4 类。描述 行索引代表分类群,列代表分类分类器。
  • 啊,我们经常被别人的短视所束缚!
  • 我确定这是最近提出的问题的重复

标签: r dataframe dplyr data-wrangling


【解决方案1】:

mutate & coalesce 怎么样?

library(dplyr, warn.conflicts = FALSE)

df = data.frame(
    Family = c('Gemmatimonadaceae', 'Bacillaceae', 'Blastocatellaceae'),
    Genus = c('Roseisolibacter', 'Bacillus', NA),
    Species = c('Roseisolibacter_agri', NA, NA))

df %>%  
    mutate(Genus = coalesce(Genus, paste('Unclassified', Family)),
           Species = coalesce(Species, 
                              if_else(grepl('^Unclassified', Genus),
                                      Genus, paste('Unclassified', Genus))))
#>              Family                          Genus
#> 1 Gemmatimonadaceae                Roseisolibacter
#> 2       Bacillaceae                       Bacillus
#> 3 Blastocatellaceae Unclassified Blastocatellaceae
#>                          Species
#> 1           Roseisolibacter_agri
#> 2          Unclassified Bacillus
#> 3 Unclassified Blastocatellaceae

reprex package (v2.0.0) 于 2021 年 6 月 24 日创建

【讨论】:

  • 我忘记了coalesce。很好的答案。
  • 你想要dplyr,而不是tidyr。如所写,您的代码加倍了“未分类”。我对您的答案进行了编辑。 (我还让屏幕上的数据更容易阅读。)
【解决方案2】:

我认为replace_na() 不会给你你想要的,因为你需要将逻辑应用于缺少Species 的行:它们的未分类方式取决于Genus 是否缺失。

这似乎给了你想要的:

df %>% 
  mutate(
    MissingGenus=is.na(Genus),
    Genus=ifelse(MissingGenus, paste(Family, "Unclassified"), Genus),
    Species=ifelse(
             is.na(Species), 
             ifelse(
               MissingGenus, 
               paste(Family, "Unclassified"), 
               paste(Genus, "Unclassified")
             ), 
             Species)
  ) %>% 
  select(-MissingGenus)
# A tibble: 3 x 3
  Family            Genus                          Species                       
  <chr>             <chr>                          <chr>                         
1 Gemmatimonadaceae Roseisolibacter                Roseisolibacter_agri          
2 Bacillaceae       Bacillus                       Bacillus Unclassified         
3 Blastocatellaceae Blastocatellaceae Unclassified Blastocatellaceae Unclassified

一个小要求:下次请dput()您的示例数据,而不是发布图像或表格。它使测试解决方案变得更加容易。

【讨论】:

    猜你喜欢
    • 2021-01-24
    • 1970-01-01
    • 2019-11-01
    • 2012-10-16
    • 2020-06-24
    • 2014-01-09
    • 2013-04-24
    • 2018-07-28
    • 2018-09-22
    相关资源
    最近更新 更多