我有一个整数的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))
答案 0 :(得分:2)
我们可以使用sapply
和which.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