R 将带有数字和普通数字向量的字符矩阵转换为数字
从理论上讲,这个简单的任务今天让我发疯。我对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) 从纯文本中获取一些数字
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…噢,哇。。这是救命恩人。工作起来很有魅力!非常感谢!几个小时前就应该问这个问题;-在我寻找生命的地方,我还没有找到这个函数。完美的