转换二进制数据

时间:2018-04-03 16:21:01

标签: r binary

我有一个只包含0和1的数据框。所以对于每个人而不是一个具有事实值的列(例如低价,4个房间)我有

      V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21
1     0  0  0  1  0  0  0  1  0   1   0   0   0   0   1   1   0   0   0   1   0
2     1  0  0  0  0  0  0  1  1   0   0   0   0   0   1   0   0   1   0   0   1
3     0  0  0  1  1  0  0  0  0   0   1   0   0   0   1   1   0   0   1   0   0
4     0  0  0  1  0  1  0  0  0   0   1   0   1   0   0   0   1   0   1   0   0

如何在R中转换数据集,以便创建新列(#number of rooms)并将1(在第4列)中的位置赋予vhigh值? 我有多个支出的varibales我需要这样做。 21列表示1000个观察值的6个变量。应该是这样的

     PurchaseP.   NumberofRooms ...
1.      vhigh.         4
2.      low.           4
3.      vhigh.         1
4.      vhigh.         2

这里只为前2个epxlenatory varibales做了,但基本上它重复这样,每个explenatory变量有3-4个可能的因果值。

V1:V4 =购买价格,V5:V8 =房间数量,V9:V11 =楼层,等等

在我看来,这样的事情可以起作用

  1. 创建一个if statemt,根据列位置给每个1一个值,例如。如果V4中的值= 1,则命名" vhigh"。并为每个Vx执行此操作
  2. 然后组合每一列V1:V4,V5:V8,V9:V11(取决于它是否有3-4个可能的因子/整数值),同时忽略0值。
  3. 这会有用吗,还是有更简单的方法?如何在R中编码?

1 个答案:

答案 0 :(得分:0)

这是一种适合您的方法。我写了一个函数,它将把你的data.frame作为参数,代表你感兴趣的一个变量的列(例如购买价格存储在第1列到第4列中),以及你想要的结果名称。然后该函数将返回您请求的结果。你需要为你感兴趣的6个变量写出来。

我将模拟一些数据并说明方法。

df <- data.frame(matrix(rep(c(0,0,0,1, 1,0,0,0, 1,0,0,0,0,0,0,1), 2), 
                        nrow = 4, byrow = T))
df
#>   X1 X2 X3 X4 X5 X6 X7 X8
#> 1  0  0  0  1  1  0  0  0
#> 2  1  0  0  0  0  0  0  1
#> 3  0  0  0  1  1  0  0  0
#> 4  1  0  0  0  0  0  0  1

我们会说前四列是v.low到v.high的购买价格,后四列是房间数量(1:4)。我们将编写一个函数,将此信息作为参数并返回结果:

rangeToCol <- function(df, # Your data.frame
                       range, # the columns that incode the category of interest
                       lev.names # The names of the category levels
                       ) {
  tdf <- df[range]
  lev.names[unlist(apply(tdf, 1, function(rw){which(rw==1)}))]
}

new.df <- data.frame(PurchaseP = rangeToCol(df, 1:4,  
                                 c('vlow','low','high','vhigh')),
                     NumberofRooms = rangeToCol(df, 5:8, c(1:4)))
new.df
#>   PurchaseP NumberofRooms
#> 1     vhigh             1
#> 2      vlow             4
#> 3     vhigh             1
#> 4      vlow             4