编写一个函数以从 str_split() 获取后面的元素

Write a function to get later elements from str_split()

我最近收到了大量的数据集,在一个列中包含多个数据,就像标题表明我正在尝试为 return 一些后来的拆分元素编写一个函数。我四处寻找解决方案,了解如何仅获取第一个元素或最后一个元素,但无法 select 哪些元素被 returned。这看起来像是这些数据集中的一个持续存在的问题,所以我可以抽象出一个解决方案会很高兴。

示例: 理想情况下,此函数 return 只是这些生物体的二项式名称,但我不希望它固定在字符串的后面,因为有时在名称

之后会有更多不需要的信息
library(tidyverse)

foo <-  data.frame(id = paste0("a", 1:6),
                      Organisms = c("EA - Enterobacter aerogenes",  "EA - Enterobacter aerogenes",
                                    "KP - Klebsiella pneumoniae", "ACBA - Acinetobacter baumannii",
                                    "ENC - Enterobacter cloacae", "KP - Klebsiella pneumoniae")) 
 ## just the first element (does not allow you to select 2 elements)                    
Orgsplit_abrev <- function(x){
  sapply(str_split(x," "), getElement, 1)
}

foo %>%
  summarise(Orgsplit_abrev(Organisms))


str_split(foo$Organisms, " ")[[1]][c(3,4)]

我们可以使用 tail - 因为要 returned 的元素不止一个,return 作为 list

Orgsplit_abrev <- function(x){
  lapply(str_split(x," "), tail, 2)
}

-测试

foo %>%
   summarise(Orgsplit_abrev(Organisms))
Orgsplit_abrev(Organisms)
1   Enterobacter, aerogenes
2   Enterobacter, aerogenes
3    Klebsiella, pneumoniae
4  Acinetobacter, baumannii
5     Enterobacter, cloacae
6    Klebsiella, pneumoniae

另外,如果我们想指定索引,创建一个lambda函数

Orgsplit_abrev <- function(x){
  lapply(str_split(x," "), function(x) x[c(3, 4)])
}

或者也可以将 Extract 与 [

一起使用
Orgsplit_abrev <- function(x){
   lapply(str_split(x," "),`[`, c(3, 4))
 }

为什么不使用“-”分隔符拆分?

> str_split(foo$Organisms, "-") %>% do.call('rbind', .)
     [,1]    [,2]                      
[1,] "EA "   " Enterobacter aerogenes" 
[2,] "EA "   " Enterobacter aerogenes" 
[3,] "KP "   " Klebsiella pneumoniae"  
[4,] "ACBA " " Acinetobacter baumannii"
[5,] "ENC "  " Enterobacter cloacae"   
[6,] "KP "   " Klebsiella pneumoniae"

tail 也是一个好主意,但我会使用 -2 而不是 2 来保留除前两个元素之外的所有元素(因此它允许完全包含更多混乱的名称):

Orgsplit_abrev <- function(x){
  lapply(str_split(x," "), tail, -2)
}

或使用 lambda 函数

Orgsplit_abrev <- function(x){
  lapply(str_split(x," "), function(x) x[3:])
}