【问题标题】:How do I extract the number from a string vector and convert it to a integer vector? [duplicate]如何从字符串向量中提取数字并将其转换为整数向量? [复制]
【发布时间】:2019-09-15 19:08:44
【问题描述】:

我在 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 ...

我想将其转换为整数向量,以便能够执行集群分析(获取集群性能指数)。因为我收到以下错误:参数 'part' must be an integer vector

什么是最有效的解决方案?

【问题讨论】:

  • 我不确定将分类变量转换为整数 1 以进行聚类分析是否是个好主意,因为像 7>6>5... 这样的数字排序不是你的意思我猜是在寻找。

标签: r vector data-science data-processing


【解决方案1】:

str 输出表明您有一个因子,而不是字符串向量。它还显示级别标签为Type 1Type 2 等。一个因子将在内部将第一个级别表示为 1,将第二个级别表示为 2,依此类推。所以,假设我们在最后的注释中重复显示了data,要将其转换为整数向量,我们只需要使用as.integer

as.integer(data)
## [1] 1 2 1 3 4 1 2 4 2 3

如果标签级别实际上不是Type 1Type 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")

【讨论】:

  • as.integer(data) 成功了。感谢这个简单但很棒的解决方案
【解决方案2】:

boski 解决方案的替代方案,对于不熟悉正则表达式的人来说可能更容易:

data <- as.numeric(as.character(gsub("Type ", "", data)))

这当然假设您的字符串始终以“类型”和空格开头。

还要注意,我在转换为数字之前先转换为字符。从因子直接转换为数字可能很危险。

【讨论】:

    【解决方案3】:
    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))
    

    【讨论】:

    • 如果号码有两位或更多位数,此解决方案不起作用。
    【解决方案4】:

    由于每个字符串只有一个数值实例,因此可以选择 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")
    

    【讨论】:

    • 不幸的是,这对我的情况不起作用
    • @SakibShahriar 根据您的 cmets 不清楚
    • parse_vector(x, col_number(), na = na, locale = locale, trim_ws = trim_ws) 错误:is.character(x) 不正确
    • 我收到了上述错误,但上面提到的其他方法可以解决问题。感谢您的帮助@akrun
    • @SakibShahriar 你可能有一个因子列。只需转换为字符parse_number(as.character(v1))
    猜你喜欢
    • 1970-01-01
    • 2016-05-03
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 2013-09-27
    • 2016-05-03
    • 1970-01-01
    相关资源
    最近更新 更多