将具有数字和纯数字向量的字符矩阵转换为数字
Converting character matrix with vectors of numerics and plain numerics into numeric
今天这个理论上简单的任务结果让我发疯。我是 R 的新手,但到目前为止相处得很好。也许你们中的某些人更容易解决它。
简而言之:如何从与此相似的某种 'mixed' 字符矩阵中获取每次观察的最大值?
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)
从纯文本中获取一些数字。这个returns我是一个字符矩阵(根据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 视图中显示时没有引号(虚拟))。使用
将其转换为数字
as.numeric(dummy)
让我失去了带有 NA 的矩阵中的向量。不是我想要的。我希望每个 "c(1.2,5)" 都被解释为 'real'/'无引号 c(1.2,5),数字当然也是数字。
我什至尝试对列进行 strsplit/gsub,但这似乎也没有效果,或者我只是做错了。
gsub( ",|c\(|\)", ",", dummy)
留给我 NA 作为 , 没有正确解释并且
as.numeric(strsplit(dummy, ",|.\(|\)"))
不允许我将列表对象强制返回为数字
因此,直截了当的问题是:
如何将类似于 dummy 的字符矩阵转换为 "usable" 形式以在普通数字和由数字组成的向量上应用数字函数?
感谢您的帮助!我觉得这应该很容易..但我现在坚持了很长一段时间。
您可以使用 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"
和括号,用逗号和(可选)space 将其拆分,展平为单级列表,并转换为数字.
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。
你可以使用这个:
apply(dummy, 1, function(x) max(eval(parse(text=x))))
结果:
[1] 3.0 2.0 1.5 2.9
今天这个理论上简单的任务结果让我发疯。我是 R 的新手,但到目前为止相处得很好。也许你们中的某些人更容易解决它。
简而言之:如何从与此相似的某种 'mixed' 字符矩阵中获取每次观察的最大值?
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)
从纯文本中获取一些数字。这个returns我是一个字符矩阵(根据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 视图中显示时没有引号(虚拟))。使用
将其转换为数字as.numeric(dummy)
让我失去了带有 NA 的矩阵中的向量。不是我想要的。我希望每个 "c(1.2,5)" 都被解释为 'real'/'无引号 c(1.2,5),数字当然也是数字。
我什至尝试对列进行 strsplit/gsub,但这似乎也没有效果,或者我只是做错了。
gsub( ",|c\(|\)", ",", dummy)
留给我 NA 作为 , 没有正确解释并且
as.numeric(strsplit(dummy, ",|.\(|\)"))
不允许我将列表对象强制返回为数字
因此,直截了当的问题是: 如何将类似于 dummy 的字符矩阵转换为 "usable" 形式以在普通数字和由数字组成的向量上应用数字函数?
感谢您的帮助!我觉得这应该很容易..但我现在坚持了很长一段时间。
您可以使用 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"
和括号,用逗号和(可选)space 将其拆分,展平为单级列表,并转换为数字.
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。
你可以使用这个:
apply(dummy, 1, function(x) max(eval(parse(text=x))))
结果:
[1] 3.0 2.0 1.5 2.9