【问题标题】:How to keep the first part of a name if differents species name in big dataset R如果大数据集R中的物种名称不同,如何保留名称的第一部分
【发布时间】:2021-04-14 06:56:35
【问题描述】:

我必须清理 R 中的数据表,但我卡在一个点

我正在搜索如何通过保留物种名称的第一部分(在“_”之前并添加“.sp”)来在表格中具体化,如果它不具体的话。

如果我给你一个例子会更好:

我有一张这样的桌子:

reads |            species
ST311 | cylindrotheca_closterium 
ST311  | cylindrotheca_fusiformis
ST311  | cylindrotheca_fusiformis
ST311 | cylindrotheca_fusiformis
ST311  | cylindrotheca_closterium
ST312 | alexandrium_minutum
ST317 |pseudo.nitzschia_australis

最后,我只需要相同读数和同一属的不同物种,这里以它的 cylindrotheca 为例:对于这个阅读“ST311”的所有物种,输入:“cylindrotheca_sp”。

如果读取是特定的,例如 ST312 用于 alexandrium minutum 和 ST317 用于伪 nitzschia australis 我想保留它。

这是我期望的表:

reads |            species
ST311 | cylindrotheca_sp 
ST311  | cylindrotheca_sp
ST311  | cylindrotheca_sp
ST311 | cylindrotheca_sp
ST311  | cylindrotheca_sp
ST312 | alexandrium_minutum
ST317 |pseudo.nitzschia_australis

我是这么想的:(我知道它错了......但是有这个想法)

TEST <-prim51test %>% 
  group_by(read) %>%
  if(species > 1){
  print == "*_sp"
  }

(我有一个包含很多不同物种的大数据集)

我该怎么做?

感谢您的帮助

【问题讨论】:

    标签: r database filter selection data-cleaning


    【解决方案1】:

    您可以使用sub 删除下划线后的所有内容并替换为'_sp'

    df$new_species <- sub("_.*", "_sp", df$species)
    df
    
    #  reads                  species      new_species
    #1 ST311 cylindrotheca_closterium cylindrotheca_sp
    #2 ST311 cylindrotheca_fusiformis cylindrotheca_sp
    #3 ST311 cylindrotheca_fusiformis cylindrotheca_sp
    #4 ST311 cylindrotheca_fusiformis cylindrotheca_sp
    #5 ST311 cylindrotheca_closterium cylindrotheca_sp
    

    对于更新的条件,您可以尝试:

    library(dplyr)
    
    df %>%
      add_count(reads) %>%
      mutate(species = ifelse(n > 1, sub("_.*", "_sp", species), species)) %>%
      select(-n) -> df
    df
    
    #  reads                   species
    #1 ST311          cylindrotheca_sp
    #2 ST311          cylindrotheca_sp
    #3 ST311          cylindrotheca_sp
    #4 ST311          cylindrotheca_sp
    #5 ST311          cylindrotheca_sp
    #6 ST312       alexandrium minutum
    #7 ST314 pseudonitzschia_australis
    

    数据

    df <- structure(list(reads = c("ST311", "ST311", "ST311", "ST311", 
    "ST311"), species = c("cylindrotheca_closterium", "cylindrotheca_fusiformis", 
    "cylindrotheca_fusiformis", "cylindrotheca_fusiformis", "cylindrotheca_closterium"
    )), class = "data.frame", row.names = c(NA, -5L))
    

    【讨论】:

    • 非常感谢!但是,如果物种不同且并非总是如此,我怎么能做到这一点?因为如果可以的话,我会拥有物种名称
    • 有些读物只有一个物种或所有物种都相同,在这种情况下没关系,但有时像示例一样,我只想在“物种”列中更改它们的名称以用于单个术语(以 .sp 结尾)。你知道怎么解决吗?谢谢...我在 R 方面没有真正的经验
    • @Lpr 您可以使用df$species &lt;- sub("_.*", "_sp", df$species) 更改同一列。你试过答案吗?它返回什么?
    • 你好,当我这样做时,它给了我无处不在的 .sp,我需要在最后读取一个环境 = 一个物种,我希望它的不同物种回到分类水平并放.sp。但并非总是仅当物种对于一次阅读不同时。
    • @Lpr 然后显示一个更好的例子。现在我的回答给出了您在新帖子中显示的预期输出。
    【解决方案2】:

    如果我理解正确,您希望为每个 read 替换后缀是唯一的那些物种的名称(即后缀)。

    首先,您可以使用gsub 在 pre 上创建一个表格,就足够了。这在这里给出了一个 3x2x2 数组A,我们使用&gt; 1 将其转换为逻辑类。从colSums cs,我们想知道rownames 中的哪一列的值1。给出一个命名匹配向量m,我们通过Mapreadsspecies 上发送该向量,其中我们使用&lt;&lt;- 将匹配的后缀替换为"_sp" .

    A <- with(d, table(gsub(".*_", "", species), gsub("_.*", "", species), reads)) > 1
    (cs <- colSums(A, 3))
    #              reads
    #               ST311 ST312
    # ceratoneis        1     0
    # cylindrotheca     2     1
    m <- apply(cs, 2, function(x) rownames(cs)[which(x == 1)])
    invisible(Map(function(i, j) {
      d$species[d$reads %in% i & grepl(j, d$species)] <<- paste0(j, "_sp")
      }, names(m), m))
    d
    #    reads                  species
    # 1  ST311 cylindrotheca_closterium
    # 2  ST311 cylindrotheca_fusiformis
    # 3  ST311 cylindrotheca_fusiformis
    # 4  ST311 cylindrotheca_fusiformis
    # 5  ST311 cylindrotheca_closterium
    # 6  ST311            ceratoneis_sp
    # 7  ST311            ceratoneis_sp
    # 8  ST312     ceratoneis_reimannii
    # 9  ST312         cylindrotheca_sp
    # 10 ST312    ceratoneis_closterium
    # 11 ST312         cylindrotheca_sp
    # 12 ST312         cylindrotheca_sp
    

    数据:

    注意:我随意扩展了数据以准备代码以获得最佳可伸缩性。

    d <- structure(list(reads = c("ST311", "ST311", "ST311", "ST311", 
    "ST311", "ST311", "ST311", "ST312", "ST312", "ST312", "ST312", 
    "ST312"), species = c("cylindrotheca_closterium", "cylindrotheca_fusiformis", 
    "cylindrotheca_fusiformis", "cylindrotheca_fusiformis", "cylindrotheca_closterium", 
    "ceratoneis_reimannii", "ceratoneis_reimannii", "ceratoneis_reimannii", 
    "cylindrotheca_fusiformis", "ceratoneis_closterium", "cylindrotheca_fusiformis", 
    "cylindrotheca_fusiformis")), class = "data.frame", row.names = c(NA, 
    -12L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 2012-08-22
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      相关资源
      最近更新 更多