R:替换数字的整个部分,但保持小数部分不变

时间:2015-05-27 21:28:07

标签: r numbers decimal decimalformat

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

1 个答案:

答案 0 :(得分:1)

评论者是对的。数字列表的长度并不重要。 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&C”中内置的功能。快速的语言,我们每次矢量化都会利用这种速度。