R Dummies用于子集化数据

时间:2017-04-22 20:31:49

标签: r

我有从一个地方到很多其他地方(A-Z)的GPS轴承(0-360度)的数据

我想创建4列虚拟变量,具体为:0-89度,90-179度,180-269度和270-360度。这样每个观测(A-Z)的三列中都有一个0,而列中的一个对应于它的方位。

全部谢谢!

2 个答案:

答案 0 :(得分:0)

您可以将model.matrixcut结合使用。 cut使用分组创建一个因子,model.matrix生成虚拟数据框。

x <- c(0, 67, 90, 183, 352)
res <- model.matrix(~ cut(x, c(-1, 89, 179, 269, 360))-1)

然后输出

  cut(GPS$gps_bearing, c(-1, 89, 179, 269, 360))(-1,89]
1                                                     1
2                                                     1
3                                                     0
4                                                     0
5                                                     0
  cut(GPS$gps_bearing, c(-1, 89, 179, 269, 360))(89,179]
1                                                      0
2                                                      0
3                                                      1
4                                                      0
5                                                      0
  cut(GPS$gps_bearing, c(-1, 89, 179, 269, 360))(179,269]
1                                                       0
2                                                       0
3                                                       0
4                                                       1
5                                                       0
  cut(GPS$gps_bearing, c(-1, 89, 179, 269, 360))(269,360]
1                                                       0
2                                                       0
3                                                       0
4                                                       0
5                                                       1
attr(,"assign")
[1] 1 1 1 1
attr(,"contrasts")
attr(,"contrasts")$`cut(GPS$gps_bearing, c(-1, 89, 179, 269, 360))`
[1] "contr.treatment"

现在列名称并不漂亮,应该可以更改,但矩阵就是你想要的。

答案 1 :(得分:0)

第1步:使用剪切分区温度 Step2 createDummyFeatures (存在于 mlr 库中)

install.packages("mlr")
library(mlr)

a             <- data.frame(cbind(state=c("a","b","c","d","e","f","g"), 
                                  temperature=c(0,12,89,90,180,350,360)))
a$temperature <- as.numeric(levels(a$temperature))[a$temperature]
a$bucket      <- cut(a$temperature,c(0,89,179,269,360), 
                 labels=c("0-89","90-179","180-269","270-360"),include.lowest=TRUE)
createDummyFeatures(a,cols="bucket")

我的输出:

|sno   |state |temperature |bucket.0.89 |bucket.90.179 |bucket.180.269 |bucket.270.360
|1     |a     |0           |1           |0             |0              |0
|2     |b     |12          |1           |0             |0              |0
|3     |c     |89          |1           |0             |0              |0
|4     |d     |90          |0           |1             |0              |0
|5     |e     |180         |0           |0             |1              |0
|6     |f     |350         |0           |0             |0              |1
|7     |g     |360         |0           |0             |0              |1  

如有任何疑问,请与我联系。