我有一个问题,我会很感激有关如何使用R的任何想法。问题是:我有一个乳胶表存储。表中的数字都配有小数点后的三位数字。我希望关闭这些数字,将其他数字留在表格中。 (想想代表估计结果的数字,但是尺寸为“美元”。然后,值145.553没有多大意义,145就足够了)。创建这些表格的人对此并没有太多考虑,所以我在这里试图避免手工完成这些表格。 :)
到目前为止,我只找到了如何从字符串中提取数字的不同解决方案,而不是如何更改它们,以便字符串本身不会改变。
示例:
strings <- c(
"a.name & $-436.735 $ & $-710.832$ \\\\",
"std(a.name) & $(1403.604)$ & $(1274.283)$ \\\\",
)
解决方案应该返回
strings <- c(
"a.name & $-436 $ & $-710$ \\\\",
"std(a.name) & $(1403)$ & $(1274)$ \\\\",
)
当然,如果可以正确地进行舍入,那么它会更好。但这不是最重要的。
我尝试将gsub
与\\....
一起使用来识别包含句点后跟其他三个数字的字符串,但这也为我提供了变量名称a.name
。
有没有人知道如何才能完成我想做的事情?
提前致谢!
答案 0 :(得分:2)
gsub(strings, pattern ="\\.[[:digit:]]{3}", replacement = "")
#[1] "a.name & $-436 $ & $-710$ \\\\" "std(a.name) & $(1403)$ & $(1274)$ \\\\"
为了得到四舍五入,我会沿着这些线做点什么,但括号会让它变得有点难看 -
sapply(
strsplit(
strings,
"\\$|\\$\\(|\\)\\$"
),
function(x)
paste(
x[1],'$',
ifelse(as.numeric(x[2]) <0, round(as.numeric(x[2]),0),paste0("(",round(as.numeric(x[2]),0),")")),'$',
x[3],'$',
ifelse(as.numeric(x[4]) <0, round(as.numeric(x[4]),0),paste0("(",round(as.numeric(x[4]),0),")")),'$',
x[5]
)
)
#[1] "a.name & $ -437 $ & $ -711 $ \\\\" "std(a.name) & $ (1404) $ & $ (1274) $ \\\\"
答案 1 :(得分:2)
这使用基数R gregexpr
,regmatches
和regmatches<-
来舍入带小数部分的任何数字。
即使对于像.789
这样的数字(即小数点前没有数字)和-0.4
(它应该舍入到没有减号的数字),它也能正常工作。理想情况下执行效果不佳的一种情况是,它不会从10.
这样的数字中删除尾随小数。
string <- c("a.name & $-436.735 $ & $-710.832$ \\\\",
"std(a.name) & $(1403.604)$ & $(1274.283)$ \\\\")
f <- function(x) {
pat <- "(-)?[[:digit:]]+\\.[[:digit:]]*"
m <- gregexpr(pat, x)
regmatches(x,m) <- lapply(regmatches(x,m), function(X) round(as.numeric(X)))
x
}
f(string)
# [1] "a.name & $-437 $ & $-711$ \\\\"
# [2] "std(a.name) & $(1404)$ & $(1274)$ \\\\"