我有一个只包含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 =楼层,等等
在我看来,这样的事情可以起作用
这会有用吗,还是有更简单的方法?如何在R中编码?
答案 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