首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中矩阵中的字符串操作

R中矩阵中的字符串操作
EN

Stack Overflow用户
提问于 2020-08-27 08:30:02
回答 4查看 73关注 0票数 1

我有这样一个矩阵

代码语言:javascript
复制
A = matrix( 
 c("2 (1-3)", "4 (2-6)", "3 (2-4)", "1 (0.5-1.5)", "5 (2.5-7.5)", "7 (5-9)"), 
nrow=3, 
ncol=2) 

我希望将第一个元素小于5的所有字符串(即"0“或"1”或"2“或"3”或"4")替换为"< 5“。它应该是:

代码语言:javascript
复制
B = matrix( 
  c("< 5", "< 5", "< 5", "< 5", "5 (2.5-7.5)", "7 (5-9)"), 
  nrow=3, 
  ncol=2) 

有什么想法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-08-27 08:32:40

提取第一个数字,将其转换为数字,用"<5"替换小于5的数字。

代码语言:javascript
复制
A[as.numeric(sub('(\\d+).*', '\\1', A)) < 5] <- '< 5'
A

#      [,1]  [,2]         
#[1,] "< 5" "< 5"        
#[2,] "< 5" "5 (2.5-7.5)"
#[3,] "< 5" "7 (5-9)"    

提取第一个数字并将其转换为数字的快捷方式是使用readr::parse_number

代码语言:javascript
复制
A[readr::parse_number(A) < 5] <- '< 5'
票数 2
EN

Stack Overflow用户

发布于 2020-08-27 08:33:49

使用substr()来表示每个矩阵元素的第一个字符。只要这是一个数字,就可以通过as.numeric()将其转换为1。

代码语言:javascript
复制
A[as.numeric(substr(A,1,1))<5] <- "<5"
票数 0
EN

Stack Overflow用户

发布于 2020-08-27 10:01:27

1) read.table

使用read.table获取每个单元格中的第一个数字,给出向量firstNo。然后使用replace将这些单元格替换为< 5

保留原始的输入A,这通常是为了使测试和调试更容易,但是如果您希望以任何方式覆盖它,那么就用A替换第二行代码的左侧。

不使用正则表达式和包。

代码语言:javascript
复制
firstNo <- read.table(text = A)[[1]]
B <- replace(A, firstNo < 5, "< 5")

B

给予:

代码语言:javascript
复制
     [,1]  [,2]         
[1,] "< 5" "< 5"        
[2,] "< 5" "5 (2.5-7.5)"
[3,] "< 5" "7 (5-9)" 

虽然这个问题中的示例输入不需要,但是如果左括号后面的文本可能是不规则的,那么您可能需要将fill=TRUEcomment.char = "("参数添加到read.table

2) gsubfn

gsubfn类似于gsub,只不过它将正则表达式中的捕获组(即正则表达式的括号大小的部分)输入到第二个参数中以公式符号表示的函数中,然后用函数的输出替换匹配。

代码语言:javascript
复制
library(gsubfn)

B <-  replace(A, 
  TRUE, 
  gsubfn("^(\\d) (.*)", ~ if (as.numeric(x) < 5) "< 5" else paste(x, y), A)
)

B

给予:

代码语言:javascript
复制
     [,1]  [,2]         
[1,] "< 5" "< 5"        
[2,] "< 5" "5 (2.5-7.5)"
[3,] "< 5" "7 (5-9)" 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63612114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档