编写一个函数以从 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:])
}
我最近收到了大量的数据集,在一个列中包含多个数据,就像标题表明我正在尝试为 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:])
}