零位置很重要:一个选择问题
Zero position matters: one selection problem
我想按规则匹配一些结果。就我而言:
original.names <- c("TL-13","TL-09","TL-12","TL-19A","TL-11","TL-20","TL-16",
"TL-15","TL-14","TL-10","TL-18","TL-19","TL-08A","TL-07A","TL-17A","TL-17",
"TL-21","TL-09A","TL-22","TL-08","TL-05","TL-03","TL-06","TL-07","TL-02","TL-04","TL-01")
selection <- c(1)
which(original.names==selection)
#integer(0)
但在我的例子中 TL-01
是 1
。如果我做 which(gsub("TL-|0","",original.names)==selection)
,它也不起作用
因为 10
和 01
不同,而 gsub
相等。有时我有类似8A
(数字字母)的东西,我也需要考虑这种情况。
请问有什么帮助吗?
您需要从 original.names
中删除所有字符串,然后将其转换为整数类型,然后才能进行比较。
original.names <- c("TL-13","TL-09","TL-12","TL-19A","TL-11","TL-20","TL-16",
"TL-15","TL-14","TL-10","TL-18","TL-19","TL-08A","TL-07A","TL-17A","TL-17",
"TL-21","TL-09A","TL-22","TL-08","TL-05","TL-03","TL-06","TL-07","TL-02","TL-04","TL-01")
selection <- 1
which(as.integer(gsub("\D", "", original.names)) == selection)
[1] 27
这是另一个使用 parse_number
的选项,尽管我们必须用 abs
换行,因为 readr
会将破折号视为负数。
library(readr)
which(abs(parse_number(original.names)) == selection)
# [1] 27
与@benson23 类似的方法,但捕获所需的值而不是删除。
which(as.integer(sub('TL-(\d+).*', '\1', original.names)) == selection)
#[1] 27
这会捕获 TL-
之后出现的数字,将其转换为整数并与 selection
进行比较。
我们可以使用 str_pad
:
library(stringr)
which(str_match(original.names, '\d+')==
str_pad(selection, 2, pad = "0"))
[1] 27
您可以删除 -
之前的所有内容以及 0
.
之后的所有内容
selection <- 1
which(sub("^.*-0*", "", original.names) %in% sub("^0*", "", selection))
#[1] 27
selection <- "8A"
which(sub("^.*-0*", "", original.names) %in% sub("^0*", "", selection))
#[1] 13
selection <- "01"
which(sub("^.*-0*", "", original.names) %in% sub("^0*", "", selection))
#[1] 27
selection <- c(1, "8A")
which(sub("^.*-0*", "", original.names) %in% sub("^0*", "", selection))
#[1] 13 27
我想按规则匹配一些结果。就我而言:
original.names <- c("TL-13","TL-09","TL-12","TL-19A","TL-11","TL-20","TL-16",
"TL-15","TL-14","TL-10","TL-18","TL-19","TL-08A","TL-07A","TL-17A","TL-17",
"TL-21","TL-09A","TL-22","TL-08","TL-05","TL-03","TL-06","TL-07","TL-02","TL-04","TL-01")
selection <- c(1)
which(original.names==selection)
#integer(0)
但在我的例子中 TL-01
是 1
。如果我做 which(gsub("TL-|0","",original.names)==selection)
,它也不起作用
因为 10
和 01
不同,而 gsub
相等。有时我有类似8A
(数字字母)的东西,我也需要考虑这种情况。
请问有什么帮助吗?
您需要从 original.names
中删除所有字符串,然后将其转换为整数类型,然后才能进行比较。
original.names <- c("TL-13","TL-09","TL-12","TL-19A","TL-11","TL-20","TL-16",
"TL-15","TL-14","TL-10","TL-18","TL-19","TL-08A","TL-07A","TL-17A","TL-17",
"TL-21","TL-09A","TL-22","TL-08","TL-05","TL-03","TL-06","TL-07","TL-02","TL-04","TL-01")
selection <- 1
which(as.integer(gsub("\D", "", original.names)) == selection)
[1] 27
这是另一个使用 parse_number
的选项,尽管我们必须用 abs
换行,因为 readr
会将破折号视为负数。
library(readr)
which(abs(parse_number(original.names)) == selection)
# [1] 27
与@benson23 类似的方法,但捕获所需的值而不是删除。
which(as.integer(sub('TL-(\d+).*', '\1', original.names)) == selection)
#[1] 27
这会捕获 TL-
之后出现的数字,将其转换为整数并与 selection
进行比较。
我们可以使用 str_pad
:
library(stringr)
which(str_match(original.names, '\d+')==
str_pad(selection, 2, pad = "0"))
[1] 27
您可以删除 -
之前的所有内容以及 0
.
selection <- 1
which(sub("^.*-0*", "", original.names) %in% sub("^0*", "", selection))
#[1] 27
selection <- "8A"
which(sub("^.*-0*", "", original.names) %in% sub("^0*", "", selection))
#[1] 13
selection <- "01"
which(sub("^.*-0*", "", original.names) %in% sub("^0*", "", selection))
#[1] 27
selection <- c(1, "8A")
which(sub("^.*-0*", "", original.names) %in% sub("^0*", "", selection))
#[1] 13 27