将连续变量

时间:2016-04-13 04:55:11

标签: r discretization

我试图将连续变量离散化,将其分为三个等级。我想对正连续变量(在这种情况下,收入)的日志做同样的事情。

require(dplyr)
set.seed(3)
mydata = data.frame(realinc = rexp(10000))

summary(mydata)

new = mydata %>% 
  select(realinc) %>%
  mutate(logrealinc = log(realinc),
         realincTercile = cut(realinc, 3),
         logrealincTercile = cut(logrealinc, 3),
         realincTercileNum = as.numeric(realincTercile),
         logrealincTercileNum = as.numeric(logrealincTercile)) 

new[sample(1:nrow(new), 10),]

我原以为使用cut()会对每个变量(收入和对数收入)的离散化因子产生相同的水平,因为log是单调函数。所以这里右边的两列应该是相同的,但这似乎不会发生。发生了什么事?

> new[sample(1:nrow(new), 10),]
       realinc  logrealinc  realincTercile logrealincTercile realincTercileNum logrealincTercileNum
7931 0.2967813 -1.21475972 (-0.00805,2.83]     (-4.43,-1.15]                 1                    2
9036 0.9511824 -0.05004944 (-0.00805,2.83]      (-1.15,2.15]                 1                    3
8204 4.5365676  1.51217069     (2.83,5.66]      (-1.15,2.15]                 2                    3
3136 2.0610693  0.72322490 (-0.00805,2.83]      (-1.15,2.15]                 1                    3
9708 0.9655805 -0.03502581 (-0.00805,2.83]      (-1.15,2.15]                 1                    3
5942 0.9149351 -0.08890215 (-0.00805,2.83]      (-1.15,2.15]                 1                    3
4631 0.6987581 -0.35845064 (-0.00805,2.83]      (-1.15,2.15]                 1                    3
7309 1.9532566  0.66949804 (-0.00805,2.83]      (-1.15,2.15]                 1                    3
7708 0.4220254 -0.86268973 (-0.00805,2.83]      (-1.15,2.15]                 1                    3
2965 1.3690976  0.31415186 (-0.00805,2.83]      (-1.15,2.15]                 1                    3

编辑: @ nicola的评论解释了问题的根源。似乎在cut的文档中,“等长间隔”是指连续参数空间中间隔的长度。我原先将“等长间隔”解释为分配给每个切口(在输出上)的元素数量相等(而不是输入)。

是否有一项能够完成我所描述的功能? - 每个输出级别中的元素数量相等?同等地,newfunc(realinc)newfunc(logrealinc)的等级相等?

1 个答案:

答案 0 :(得分:5)

如果您希望平均填充水平,请查看LEFT JOIN功能。试试例如:

WHERE PK IS NULL