R中的Ceil和floor值

时间:2017-07-26 12:45:50

标签: r

我有一个整数的data.table,其值介于1到60之间。

我的问题是关于地板或天花板的任何数字,如下数值:12 18 24 30 36 ... 60。

例如,假设我的data.table包含数字13.我希望R将这个数字“转换”为12和18,因为13位于这些数字之间。而且,如果我有18岁,我希望R保持在18岁。

如果我的data.table包含值50,我希望R将该数字转换为48和54,依此类推。

我的目标是获得两个不同的data.tables。保存地板值的地方和保存地理价值的地方之一。

知道如何在R中做到这一点?

编辑:小于12的数字应始终转换为12。

示例输出:

如果有以下data.table data.table(c(1,28,29,41,53,53,17,41,41,53))

我想要以下两个输出data.tables:floored values data.table(c(12,24,24,36,48,48,12,36,36,48))

我想要以下两个输出data.tables:ceiled values data.table(c(12,30,30,42,54,54,18,42,42,54))

2 个答案:

答案 0 :(得分:2)

我们可以使用sapplywhich.min函数执行此操作。从你的问题来看,目前还不清楚价值< 12应该处理。

x <- 1:60
num_list <- seq(12, 60, 6)

floorr <- sapply(x, function(x){
 diff_vec <- x - num_list
 diff_vec <- ifelse(diff_vec < 0, Inf, diff_vec)
 num_list[which.min(diff_vec)]
})


ceill <- sapply(x, function(x){
  diff_vec <- num_list - x
  diff_vec <- ifelse(diff_vec < 0, Inf, diff_vec)
  num_list[which.min(diff_vec)]
})

tail(cbind(x, floorr, ceill))

       x floorr ceill
[55,] 55     54    60
[56,] 56     54    60
[57,] 57     54    60
[58,] 58     54    60
[59,] 59     54    60
[60,] 60     60    60

答案 1 :(得分:2)

这是一种相当直接的方法(如果有任何值,则编辑为最多12个):

df <- data.frame(nums = 10:20)
df$floors <- with(df,pmax(12,6*floor(nums/6)))
df$ceils <- with(df,pmax(12,6*ceiling(nums/6)))

导致:

> df
   nums floors ceils
1    10     12    12
2    11     12    12
3    12     12    12
4    13     12    18
5    14     12    18
6    15     12    18
7    16     12    18
8    17     12    18
9    18     18    18
10   19     18    24
11   20     18    24