提取列表向量的第n个元素

时间:2020-07-03 08:43:06

标签: r list vector

我有以下ID。

+---+---+---+---+----------------+-------------------+----+
|  a|  b|  c|  d|  elements_array|         main_array|flag|
+---+---+---+---+----------------+-------------------+----+
| a6| b6| c6|d27|[b2, c3, a1, d7]|  [a6, b6, c6, d27]|   0|
| a9|b88|c54|d71|[b2, c3, a1, d7]|[a9, b88, c54, d71]|   0|
+---+---+---+---+----------------+-------------------+----+

我想提取它们的数字部分(001、002、003)。 我尝试了这个:

ids <- c('a-000', 'b-001', 'c-002')

返回以下内容:

(str_split(ids, '-', n=2))[2]

我不希望列表的第二个元素。我想要向量中所有元素的第二个元素。我知道这绝对是一个基本问题,但是如何解决语法冲突?通过lambda函数吗?

5 个答案:

答案 0 :(得分:2)

此功能在R底下也可用。

sapply(strsplit(ids, "-"), `[`, 2)
# [1] "000" "001" "002"

您也可以尝试gsubsubstring

gsub("\\D+", "", ids)
# [1] "000" "001" "002"
substring(ids, 3)
# [1] "000" "001" "002"

答案 1 :(得分:1)

要继续尝试,可以使用sapply

sapply(stringr::str_split(ids, '-', n=2), `[`, 2)
#[1] "000" "001" "002"

最好在这里使用str_split_fixed

stringr::str_split_fixed(ids, '-', n=2)[, 2]
#[1] "000" "001" "002"

或者在基数R中:

sub('.*?-(.*)-?.*', '\\1', ids)

答案 2 :(得分:1)

您可以尝试str_remove(ids, "\\D+")

答案 3 :(得分:1)

使用基数R可以删除所有非数字字符:

ids <- c('a-000', 'b-001', 'c-002')

gsub("[^[:digit:]]", "", ids)
#> [1] "000" "001" "002"

[:digit:]是数字的正则表达式,^表示不是数字的所有内容,因此您基本上用空字符串""替换所有其他字符。

有关更多信息,请参见R中gsub()regex的文档。

答案 4 :(得分:0)

带有str_replace

的选项
library(stringr)
str_replace(ids, "\\D+", "")
#[1] "000" "001" "002"