在 R 中对一个变量的不同值使用 floor 和 ceiling
Using floor and ceiling on different values of one variable in R
我想在 R 中格式化一个变量,使用 round
、floor
或 ceiling
。但是,我有时想对同一变量的不同值使用 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
您可以根据需要自定义条件。
我想在 R 中格式化一个变量,使用 round
、floor
或 ceiling
。但是,我有时想对同一变量的不同值使用 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
您可以根据需要自定义条件。