我有这样一个矩阵
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“。它应该是:
B = matrix(
c("< 5", "< 5", "< 5", "< 5", "5 (2.5-7.5)", "7 (5-9)"),
nrow=3,
ncol=2) 有什么想法吗?
发布于 2020-08-27 08:32:40
提取第一个数字,将其转换为数字,用"<5"替换小于5的数字。
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。
A[readr::parse_number(A) < 5] <- '< 5'发布于 2020-08-27 08:33:49
使用substr()来表示每个矩阵元素的第一个字符。只要这是一个数字,就可以通过as.numeric()将其转换为1。
A[as.numeric(substr(A,1,1))<5] <- "<5"发布于 2020-08-27 10:01:27
1) read.table
使用read.table获取每个单元格中的第一个数字,给出向量firstNo。然后使用replace将这些单元格替换为< 5。
保留原始的输入A,这通常是为了使测试和调试更容易,但是如果您希望以任何方式覆盖它,那么就用A替换第二行代码的左侧。
不使用正则表达式和包。
firstNo <- read.table(text = A)[[1]]
B <- replace(A, firstNo < 5, "< 5")
B给予:
[,1] [,2]
[1,] "< 5" "< 5"
[2,] "< 5" "5 (2.5-7.5)"
[3,] "< 5" "7 (5-9)" 虽然这个问题中的示例输入不需要,但是如果左括号后面的文本可能是不规则的,那么您可能需要将fill=TRUE或comment.char = "("参数添加到read.table。
2) gsubfn
gsubfn类似于gsub,只不过它将正则表达式中的捕获组(即正则表达式的括号大小的部分)输入到第二个参数中以公式符号表示的函数中,然后用函数的输出替换匹配。
library(gsubfn)
B <- replace(A,
TRUE,
gsubfn("^(\\d) (.*)", ~ if (as.numeric(x) < 5) "< 5" else paste(x, y), A)
)
B给予:
[,1] [,2]
[1,] "< 5" "< 5"
[2,] "< 5" "5 (2.5-7.5)"
[3,] "< 5" "7 (5-9)" https://stackoverflow.com/questions/63612114
复制相似问题