在有联系的情况下,使用最后一行将子集划分为虚拟变量

时间:2019-06-10 21:45:21

标签: r dplyr data.table

我在数据框中有一个列的子集,我希望将其转换为   虚拟变量。

  1. 具有最大值的列将得到1,所有其他哑元 变量为零。

  2. 如果有平局,则使用前几行虚拟变量 编码。

  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解决方案。

2 个答案:

答案 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