分配6"代码"到单个变量的不同值范围

时间:2018-04-19 09:07:40

标签: r

我正在尝试解决以下问题。我有一个变量,我想相应地应用特定的代码:

值0到5 =" 1"

值5到10 =" 2"

值10到20 =" 3"

值> 20 =" 4"

值0到-5)=" -1"

值-5到-10 =" -2"

值-10到-20 =" -3"

值< -20 =" -4"

以下是感兴趣变量的模拟示例(" var")。由于我在一个数据框中有一个错误消息,并且有一些关于"条件具有经度",我也将它放在数据框中:

var=c(rep(1,3), rep(5,3), rep(10, 3), rep(20,3), rep(-1,3), rep(-5,3), rep(-10, 3), rep(-20,3))
var2=c(rep("long", 12), rep("short", 12))
df=data.frame(var, var2)

我试图通过ifelse函数解决我正在处理的实际数据这个问题,但我只知道如何将它应用于三个数据类。

var3=ifelse(df$var >= 20, 3, ifelse(df$var<10,1,2)) 

我还尝试了另一种方法,其他方法是函数:

df$var3=if (df$var < -20) 
{print("-4")}
else if (df$var < -10) 
{print("-3")}
else if (df$var < -5) 
{print("-2")}
else if (df$var < 0) 
{print("-1")}
else if (df$var > 0) 
{print("1")}
else if (df$var > 5) 
{print("2")}
else if (df$var > 10) 
{print("3")}
else (df$var > 20) 
{print("4")}

但后者只会引发各种错误。我怎样才能最好地做我想做的事情?请帮忙。谢谢!

1 个答案:

答案 0 :(得分:0)

正如@Sotos在评论中提到的,我们可以使用cut

eps <- 1e-10;
df$var3 <- cut(
    df$var,
    breaks = c(-Inf, -20 + eps, -10 + eps, -5 + eps, 0, 5 - eps, 10 - eps, 20 - eps, Inf),
    labels = c("-4", "-3", "-2", "-1", "1", "2", "3", "4"))
#   var  var2 var3
#1    1  long    1
#2    1  long    1
#3    1  long    1
#4    5  long    2
#5    5  long    2
#6    5  long    2
#7   10  long    3
#8   10  long    3
#9   10  long    3
#10  20  long    4
#11  20  long    4
#12  20  long    4
#13  -1 short   -1
#14  -1 short   -1
#15  -1 short   -1
#16  -5 short   -2
#17  -5 short   -2
#18  -5 short   -2
#19 -10 short   -3
#20 -10 short   -3
#21 -10 short   -3
#22 -20 short   -4
#23 -20 short   -4
#24 -20 short   -4

请注意,var3character向量(根据您的问题陈述);如有必要,请更改为numeric