2

这个理论上简单的任务今天让我发疯了。我对 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)”解释为好像它是一个“真实的”/“无引号的 c(1.2,5)”,并且数字当然也是数字。

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

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

给我留下了 NAs 作为 , 没有正确解释和

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

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

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

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

4

3 回答 3

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
于 2018-07-10T17:57:00.367 回答
1

如果您想要一个tidyverse解决方案,这里有一个使用purrrand的解决方案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 包(v0.2.0) 于 2018 年 7 月 10 日创建。

于 2018-07-10T18:05:22.420 回答
1

你可以使用这个:

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

结果:

[1] 3.0 2.0 1.5 2.9
于 2018-07-10T18:08:00.183 回答