在 R 中对一个变量的不同值使用 floor 和 ceiling

Using floor and ceiling on different values of one variable in R

我想在 R 中格式化一个变量,使用 roundfloorceiling。但是,我有时想对同一变量的不同值使用 floor,有时使用 ceiling。这可能吗?

我的数据框是data,我要格式化的变量是var。这些是它的值(有频率):

Value    |      Freq.
---------|-----------
1        |       1504
1.333333 |        397
1.5      |          9
1.666667 |        612
2        |       2096
2.333333 |       1057
2.5      |         18
2.666667 |       1270
3        |       2913
3.333333 |       1487
3.5      |         35
3.666667 |       1374
4        |       2007
4.333333 |        779
4.5      |         16
4.666667 |        522
5        |       1913
NaN      |        553

我想要的结果是一个看起来像这样的变量 var2

Value |      Freq.
------|-----------
1     |       1910
2     |       3783
3     |       5670
4     |       4195
5     |       2451     
NaN   |        553

因此,1.5 和 2.5 向下调整 (floor),但 3.5 和 4.5 向上调整 (ceiling)。其他值按通常方式四舍五入。

我的尝试是这样的,但是还不行:

data$var2 <- format(round(data$var, 1))
if (data$var2 == 1.7||2.7||3.5||3.7||4.5||4.7) {
  data$var2 <- format(ceiling(data$var2))
} else {
  data$var2 <- format(floor(data$var2))
}

我知道在我的尝试中可能有几个错误,如果有任何帮助,我将不胜感激。

PS:我实际寻找的是 Stata 函数 egen cut 的等价物。这样很容易达到预期的效果:

egen var2 = cut(var), at(1, 1.6, 2.6, 3.5, 4.4, 5.1)
recode var2 (1 = 1) (1.6 = 2) (2.6 = 3) (3.5 = 4) (4.4 = 5)

编辑:这个答案是错误的!

我不确定这是期望的结果。在我看来,除了值 1.5 和 2.5 之外,您想四舍五入到最接近的整数。默认情况下小数点 0.5 向上舍入(这不是真的! Round up from .5)。

custom.rund <- function(x){
  if(x %in% c(1.5, 2.5)){
    floor(x)
  } else {
    round(x)
  }
}

sapply( c(1.5, 2.5, 3.5, 2, 4.6), custom.rund )
[1] 1 2 4 2 5

为此,您可以使用 dplyr 包中的 case_when 函数:

library(dplyr)

data %>% 
  mutate(var2 = case_when(var %in% c(1.5, 2.5) ~ floor(var),
                          var %in% c(3.5, 4.5) ~ ceiling(var),
                          TRUE ~ round(var)))

这个returns下面data.frame:

        var var2
1  1.000000    1
2  1.333333    1
3  1.500000    1
4  1.666667    2
5  2.000000    2
6  2.333333    2
7  2.500000    2
8  2.666667    3
9  3.000000    3
10 3.333333    3
11 3.500000    4
12 3.666667    4
13 4.000000    4
14 4.333333    4
15 4.500000    5
16 4.666667    5
17 5.000000    5
18      NaN  NaN

您可以根据需要自定义条件。