如何从字符串向量中提取数字并将其转换为整数向量?
How do I extract the number from a string vector and convert it to a integer vector?
我在 R 中有一个字符串向量如下:
[1] Type 1 Type 2 Type 4 Type 3 Type 4 Type 6 Type 2 Type 5
[9] Type 2 Type 3 Type 7
另请注意:
str(data)
# Factor w/ 7 levels "Type 1","Type 2",..: 1 2 1 3 4 1 2 4 2 3 ...
我想将其转换为整数向量以便能够执行聚类分析(获取聚类性能指标)。因为我收到以下错误:argument 'part' must be an integer vector
最有效的解决方案是什么?
as.integer(gsub(".*(\d+)","\1",data))
1 2 4 3 4 6 2 5 2 3 7
我们先去掉字符串部分,只保留数字(\d+
),然后将向量转换为整型。
编辑
要捕获高于 9
的数字,我们可以使用
as.integer(gsub(".*[:numeric:]+","\1",data))
由于每个字符串只有一个数值实例,一个选项是 parse_number
from readr
library(readr)
parse_number(v1)
#[1] 1 2 4 3 4 6 2 5 2 3 7
数据
v1 <- c("Type 1", "Type 2", "Type 4", "Type 3", "Type 4", "Type 6",
"Type 2", "Type 5", "Type 2", "Type 3", "Type 7")
boski 解决方案的替代方案,对于不熟悉正则表达式的人来说可能更容易:
data <- as.numeric(as.character(gsub("Type ", "", data)))
这当然假设您的字符串始终以 "Type" 和一个空格开头。
另请注意,我先转换为字符,然后再转换为数字。从因子直接转换为数字可能很危险。
str
输出显示您有一个因子,而不是字符串向量。它还显示了级别标签为Type 1
、Type 2
等。一个因子将在内部表示第一个级别为 1,第二个级别为 2,依此类推。因此,假设我们在最后的注释中重复显示了 data
,要将其转换为整数向量,我们只需要使用 as.integer
:
as.integer(data)
## [1] 1 2 1 3 4 1 2 4 2 3
如果标签级别实际上不是 Type 1
、Type 2
,例如,第三级别由 Type 93
表示,而不是 Type 3
然后我们可以隐式转换为字符并删除非数字字符,最后将其余部分转换为整数向量。
as.integer(gsub("\D", "", data))
## [1] 1 2 1 3 4 1 2 4 2 3
备注
data <- structure(c(1L, 2L, 1L, 3L, 4L, 1L, 2L, 4L, 2L, 3L), .Label = c("Type 1",
"Type 2", "Type 3", "Type 4"), class = "factor")
我在 R 中有一个字符串向量如下:
[1] Type 1 Type 2 Type 4 Type 3 Type 4 Type 6 Type 2 Type 5
[9] Type 2 Type 3 Type 7
另请注意:
str(data)
# Factor w/ 7 levels "Type 1","Type 2",..: 1 2 1 3 4 1 2 4 2 3 ...
我想将其转换为整数向量以便能够执行聚类分析(获取聚类性能指标)。因为我收到以下错误:argument 'part' must be an integer vector
最有效的解决方案是什么?
as.integer(gsub(".*(\d+)","\1",data))
1 2 4 3 4 6 2 5 2 3 7
我们先去掉字符串部分,只保留数字(\d+
),然后将向量转换为整型。
编辑
要捕获高于 9
的数字,我们可以使用
as.integer(gsub(".*[:numeric:]+","\1",data))
由于每个字符串只有一个数值实例,一个选项是 parse_number
from readr
library(readr)
parse_number(v1)
#[1] 1 2 4 3 4 6 2 5 2 3 7
数据
v1 <- c("Type 1", "Type 2", "Type 4", "Type 3", "Type 4", "Type 6",
"Type 2", "Type 5", "Type 2", "Type 3", "Type 7")
boski 解决方案的替代方案,对于不熟悉正则表达式的人来说可能更容易:
data <- as.numeric(as.character(gsub("Type ", "", data)))
这当然假设您的字符串始终以 "Type" 和一个空格开头。
另请注意,我先转换为字符,然后再转换为数字。从因子直接转换为数字可能很危险。
str
输出显示您有一个因子,而不是字符串向量。它还显示了级别标签为Type 1
、Type 2
等。一个因子将在内部表示第一个级别为 1,第二个级别为 2,依此类推。因此,假设我们在最后的注释中重复显示了 data
,要将其转换为整数向量,我们只需要使用 as.integer
:
as.integer(data)
## [1] 1 2 1 3 4 1 2 4 2 3
如果标签级别实际上不是 Type 1
、Type 2
,例如,第三级别由 Type 93
表示,而不是 Type 3
然后我们可以隐式转换为字符并删除非数字字符,最后将其余部分转换为整数向量。
as.integer(gsub("\D", "", data))
## [1] 1 2 1 3 4 1 2 4 2 3
备注
data <- structure(c(1L, 2L, 1L, 3L, 4L, 1L, 2L, 4L, 2L, 3L), .Label = c("Type 1",
"Type 2", "Type 3", "Type 4"), class = "factor")