R 将带有数字和普通数字向量的字符矩阵转换为数字

R 将带有数字和普通数字向量的字符矩阵转换为数字,r,matrix,data-transform,R,Matrix,Data Transform,从理论上讲,这个简单的任务今天让我发疯。我对R比较陌生,但到现在为止相处得很好。也许你们中的某个人有更轻松的时间来解决它 简言之:如何从类似于此的“混合”字符矩阵中获得每次观察的最大值 dummy = as.matrix(c("c(1.5,2.6,3)", "2", "1.5", "c(1.8, 2.9)")) 所以我的结果用数字表示:c3,2,1.5,2.9 长话短说: 我来自一个城市 stri_match_all_regex(somestring, regexp) 从纯文本中获取一些数字

从理论上讲,这个简单的任务今天让我发疯。我对R比较陌生,但到现在为止相处得很好。也许你们中的某个人有更轻松的时间来解决它

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

dummy = as.matrix(c("c(1.5,2.6,3)", "2", "1.5", "c(1.8, 2.9)"))
所以我的结果用数字表示:c3,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 Viewdummy中显示时没有引号。将其转换为数字与

as.numeric(dummy)
使我失去了NAs矩阵中的向量。不是我想要的。我希望每一个c1.2,5都被解释为一个“实数”/“无引号的c1.2,5,当然数字也是数字

我甚至尝试过strsplit/gsub列,但这似乎也没有效果,或者我只是做错了

gsub( ",|c\\(|\\)", ",", dummy)
留给我的是NAs,未正确解释和

as.numeric(strsplit(dummy, ",|.\\(|\\)"))
不允许我强制将列表对象返回到数值

因此有一个直截了当的问题: 如何将类似于dummy的字符矩阵转换为一种可用的形式,以便对普通数字和由数字组成的向量应用数值函数

谢谢你的帮助!我觉得这应该很容易。。但是我现在已经被它困扰了很长一段时间。

您可以使用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
如果您想要tidyverse解决方案,这里有一个利用purrr和stringr的解决方案。沿着dummy中的项目进行映射,我从每个条目中删除任何c和括号,用逗号和空格(可选)将其拆分,展平为单个级别列表,并转换为数字

图书馆管理员 虚拟% str\U分割,\\s?%>% 展平\u chr%>% 如:数字 > [[1]] > [1] 1.5 2.6 3.0 > > [[2]] > [1] 2 > > [[3]] > [1] 1.5 > > [[4]] > [1] 1.8 2.9 由v0.2.0于2018年7月10日创建。

您可以使用:

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

[1] 3.0 2.0 1.5 2.9

你能用你正在搜索的一些数据发布stri_match_all_regex部分吗?如果这是你可以编辑的代码的一部分,我想知道这个问题是否可以在更上游的地方被发现。那么,让我们看一个简单的例子。我正在提取系统规格,在这种情况下,例如所需的CPU速度。我使用这个regexp:DT[,Ghz_CPU_unclean:=stri_match_all_regexcelean,!*Ghz+[0-9.]{1,5}*Ghz,不区分大小写=TRUE]来处理这样的文本:OS:Windows®7 32/64位/Vista 32/64/XP处理器:奔腾4 3.0GHz内存:2 GB RAM,还有更多的行在不统一的布局中。regexp运行得很好,bnut当然可以改进。我看到@Rui Barradas已经有了类似的答案。我的最后一步是提取最大值并取消其列表,以创建单个最大值向量。使用sapply而不是UnlistApply…噢,哇。。这是救命恩人。工作起来很有魅力!非常感谢!几个小时前就应该问这个问题;-在我寻找生命的地方,我还没有找到这个函数。完美的