我想在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)
你可以使用 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.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