R:替换数字的整数部分但保留小数部分不变

R: replace the whole part of a number but keep the decimal part unchanged

好的,我是 R 的新手,这是一个一般性问题。我有各种数字,我想替换整个部分并保持小数部分不变。 例如,我的值从 25.01 到 25.99,我想用 10 替换 25 但保持小数部分不变(所以我的新数字将从 10.01 到 10.99)。 这可能吗?

评论者是对的。数字列表有多长并不重要。 R可以一次完成手术

x <- c(25.01, 25.8, 25.4)
x-15
[1] 10.01 10.80 10.40

如果你 运行 遇到一个有很多数字的情况,需要保留小数点后的数字并选择一个数字放在前面,使用这样的东西:

keep.decimal <- function(x, n=10) {
  paste0(n, gsub('\d*(\.\d*)', '\1', x))
}

然后你甚至可以在它前面选择你想要的数字。

keep.decimal(x)
[1] "10.01" "10.8"  "10.4" 
keep.decimal(x, 50)
[1] "50.01" "50.8"  "50.4" 

矢量化说明

当向量定义为 x <- 1:5 时,R 将尽可能尝试逐个元素地执行操作。如果必须将 2 添加到 x 的每个元素并分配给新变量 y,则 for 循环可能会很困难:

y <- NULL
for (i in 1:length(x)) {
  y[i] <- x[i] + 2
}
y
[1] 3 4 5 6 7

但是有了R,这个操作就简化为:

y <- x + 2

这种运算技术比算术更进一步。这是要解决的问题,编写一个表达式,将小写字母与其大写字母相匹配。所以转这个:

x <- c("a", "b", "c")
x
[1] "a" "b" "d"

进入

y
[1] "aA" "bB" "dD"

我会写

y <- paste0(x, LETTERS[match(x, letters)])
y
[1] "aA" "bB" "dD"

而不是:

y <- NULL
for(i in 1:length(x)) {
  y[i] <- paste0(x[i], LETTERS[match(x[i], letters)])
}
y
[1] "aA" "bB" "dD"

速度也快多了。作为类比,想想餐厅服务。 R 您的服务器准备好获取您想要的内容了吗?如果您向服务员要番茄酱,他们会拿到番茄酱并送来。然后你要一张餐巾纸。他们回去拿餐巾纸并送来。然后你要求补充。

这个过程需要很长时间。如果您同时要求番茄酱、餐巾纸和补充装,服务员将能够优化他们的行程,以最快的速度得到您想要的东西。 R 优化了内置于 'C' 语言中的函数,速度快如闪电,每次矢量化时我们都利用了这种速度。