在R中对一个变量的不同值使用地板和天花板。

问题描述 投票:0回答:2

我想在R中格式化一个变量,使用的是 round, floorceiling. 然而,我有时想使用 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)
r rounding stata floor ceil
2个回答
2
投票

你可以使用 case_when 函数从 dplyr 的包。

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)))

这将返回以下内容 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

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


1
投票

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

我不确定这是否是你想要的结果。在我看来,除了1.5和2.5这两个值之外,你似乎想四舍五入到最近的整数。默认情况下,0.5的小数是四舍五入的(这不是真的 从0.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
© www.soinside.com 2019 - 2024. All rights reserved.