从理论上讲,这个简单的任务今天使我发疯。我对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对象返回为数字
因此提出了一个简单的问题: 如何将类似于虚拟的字符矩阵转换为“可用”形式,以在纯数字和由数字组成的向量上应用数字函数?
感谢您的帮助!我觉得这应该很容易..但是我已经坚持了很长时间。
答案 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
解决方案,请使用purrr
和stringr
。沿着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