我在数据框中有一个列的子集,我希望将其转换为 虚拟变量。
具有最大值的列将得到1,所有其他哑元 变量为零。
如果有平局,则使用前几行虚拟变量 编码。
set.seed(45)
DF <- data.frame(matrix(sample(10, 26746*7, TRUE), ncol=7))
df <- DF %>% rename(D1 = X2, D2 = X3, D3 = X4)
head(df)
X1 D1 D2 D3 X5 X6 X7
2 2 2 10 10 1 2
8 4 1 1 8 9 10
3 4 2 3 9 2 9
3 8 1 9 2 4 1
3 1 8 1 5 4 8
1 4 3 7 3 2 6
下面是一个数据框,其中D
列是我想要的列的子集
转换为虚拟变量。
X1 D1 D2 D3 X5 X6 X7
2 0 0 1 10 1 2
8 1 0 0 8 9 10
3 1 0 0 9 2 9
3 0 0 1 2 4 1
3 0 1 0 5 4 8
1 0 0 1 3 2 6
我希望使用data.table
解决方案,但是我对基本的R
感到满意,或者
dplyr
解决方案。
答案 0 :(得分:2)
这是一个选择:
if( MembersUnits = vlookup(memberage,defaultunitstable,2,0),"Default", "Voluntary")
输出尾巴
s=(df.Label.ffill()+df.Label.bfill())
s2=(df.Label.ffill().astype(str)+df.Label.bfill().astype(str))
df.loc[df.Label.isnull()&s2.eq('1.03.0'),'Label']=s/2
df
Out[528]:
ID Label
0 1 1.0
1 2 2.0
2 3 3.0
3 4 NaN
4 5 1.0
5 6 2.0
6 7 2.0
7 8 3.0
数据:
library(zoo)
cols <- paste0("V", 2L:4L)
DT[, (cols) := {
#set largest to 1 with first for ties
m <- matrix(0L, .N, length(cols))
m[cbind(seq_len(.N), max.col(.SD, "first"))] <- 1L
#identify rows with dupes and set to NA
idx <- apply(.SD, 1L, anyDuplicated) > 0L
m[idx, seq_along(cols)] <- NA_integer_
#fill NAs with previous row (if using data.table 1.12.3, there is a nafill function)
as.data.table(zoo::na.locf(m))
}, .SDcols=cols]
数据尾巴
V1 V2 V3 V4 V5 V6 V7
1: 5 0 0 1 6 3 2
2: 8 0 0 1 4 6 3
3: 4 0 1 0 7 8 1
4: 8 1 0 0 5 3 2
5: 6 1 0 0 4 10 7
6: 9 1 0 0 5 7 3
7: 3 0 1 0 10 3 2
8: 5 1 0 0 9 8 2
9: 6 0 1 0 10 3 9
10: 6 0 1 0 8 3 9
答案 1 :(得分:0)
您的初始种子对我不起作用-我的第一行打了领带,所以我的解决方案不起作用。
library(data.table)
set.seed(46) #changed
dt <- data.table(matrix(sample(10, 23746*7, TRUE), ncol = 7))
setnames(dt, c('V2', 'V3', 'V4'), c('D1', 'D2', 'D3'))
cols <- c('D1', 'D2', 'D3')
max_dt <- dt[, .(ID = 1:.N
,max_col = apply(.SD, 1
, function (x) {
maxes <- which(x == max(x))
ifelse((length(maxes) != 1), NA_integer_, maxes)
}
)
)
, .SDcols = cols]
#Could still be a null in the first value - you'd have to determine what you want.
max_dt[, max_col := zoo::na.locf(max_col)]
max_dt
dcast(max_dt, ID ~ max_col, fun.aggregate = length, value.var = 'max_col', fill = 0)
dt[, (cols) := dcast(max_dt, ID ~ max_col, fun.aggregate = length, value.var = 'max_col', fill = 0 )[, -1]]
dt
之前:
V1 D1 D2 D3 V5 V6 V7
1: 2 3 4 6 9 8 2
2: 3 6 2 9 6 3 3
3: 6 4 3 7 6 9 10
4: 4 8 7 10 7 7 10
5: 3 7 10 8 6 1 5
---
23742: 10 6 7 10 7 3 3
23743: 9 4 10 3 4 7 9
23744: 1 9 1 8 10 8 2
23745: 8 6 6 8 7 4 8
23746: 7 3 7 8 8 10 4
之后:
V1 D1 D2 D3 V5 V6 V7
1: 2 0 0 1 9 8 2
2: 3 0 0 1 6 3 3
3: 6 0 0 1 6 9 10
4: 4 0 0 1 7 7 10
5: 3 0 1 0 6 1 5
---
23742: 10 0 0 1 7 3 3
23743: 9 0 1 0 4 7 9
23744: 1 1 0 0 10 8 2
23745: 8 0 0 1 7 4 8
23746: 7 0 0 1 8 10 4