将具有数字和纯数字向量的字符矩阵转换为数字

时间:2018-07-10 17:47:27

标签: r matrix data-transform

从理论上讲,这个简单的任务今天使我发疯。我对R相当陌生,但是到目前为止相处得还不错。也许你们当中有人有更轻松的时间来解决它。

简而言之:如何从类似于此字符的“混合”字符矩阵中获得每次观察的最大值?

dummy = as.matrix(c("c(1.5,2.6,3)", "2", "1.5", "c(1.8, 2.9)"))

这样我的结果就可以用数字表示:c(3,2,1.5,2.9)

更长的故事:

我来自

stri_match_all_regex(somestring, regexp)

从纯文本中获取一些数字。这将返回一个字符矩阵(通过stri_match_all_regex函数的定义)

在去除一些杂散字符后,使其看起来类似以下内容:

dummy = as.matrix(c("c(1.5,2.6,3)","2","1.5","c(1.8,2.9)"))

在这里,您已经在我的矩阵中看到了字符串而不是向量的复杂性。我想要的状态是识别每一行的最大值。

通常,没有什么比这更简单的了运行

lapply(dummy, max)

但是应用数字函数显然无法将这些字符伪装成数字。(直到这一点,我什至没有意识到这些字符都是数字,而不是数字,因为它们在rStudio View(dummy)中显示时没有引号) 。使用

将其转换为数字
as.numeric(dummy)

使我失去了具有NA的矩阵内的向量。不是我想要的我希望将每个“ c(1.2,5)”解释为好像是一个“不含” /“'”的数字,而数字也当然是数字。

我什至试图对列进行strsplit / gsub,但这似乎也没有成果,或者我只是做错了。

gsub( ",|c\\(|\\)", ",", dummy)

用NA作为我,没有正确解释和

as.numeric(strsplit(dummy, ",|.\\(|\\)"))

不允许我强制将elist对象返回为数字

因此提出了一个简单的问题: 如何将类似于虚拟的字符矩阵转换为“可用”形式,以在纯数字和由数字组成的向量上应用数字函数?

感谢您的帮助!我觉得这应该很容易..但是我已经坚持了很长时间。

3 个答案:

答案 0 :(得分:2)

您可以使用eval/parse来获取数值。

result <- apply(dummy, 1, function(s) {
  eval(parse(text = s))
})

result
#[[1]]
#[1] 1.5 2.6 3.0
#
#[[2]]
#[1] 2
#
#[[3]]
#[1] 1.5
#
#[[4]]
#[1] 1.8 2.9

答案 1 :(得分:1)

如果您想使用tidyverse解决方案,请使用purrrstringr。沿着dummy中的项目进行映射,我从每个条目中删除了任何"c"和括号,并用逗号和(可选)空格将其分割,展平为一个单层列表,然后转换为数字。

library(tidyverse)

dummy <- as.matrix(c("c(1.5,2.6,3)", "2", "1.5", "c(1.8, 2.9)"))

map(dummy, ~str_remove_all(., "[c\\(\\)]") %>% 
      str_split(",\\s?") %>% 
      flatten_chr() %>% 
      as.numeric()
    )
#> [[1]]
#> [1] 1.5 2.6 3.0
#> 
#> [[2]]
#> [1] 2
#> 
#> [[3]]
#> [1] 1.5
#> 
#> [[4]]
#> [1] 1.8 2.9

reprex package(v0.2.0)于2018-07-10创建。

答案 2 :(得分:1)

您可以使用此:

apply(dummy, 1, function(x) max(eval(parse(text=x))))

结果:

[1] 3.0 2.0 1.5 2.9