使用data.table

时间:2018-03-13 10:58:26

标签: r data.table multiple-columns apply

我有一个data.table DT,有几百列名为eg1,eg2,eg3,eg4,...,eg10,...

我想基于每列与其前一列的比较,为除第一列(eg1)之外的所有列生成新列。

DT:

eg1 eg2 eg3 eg4 eg5
1   1   1   0   0
0   0   0   0   0
0   1   0   1   1
0   0   1   1   1
1   0   0   0   0
1   1   1   1   1

我希望:

eg1 eg2 eg3 eg4 eg5    eg2_m    eg3_m   eg4_m   eg5_m
1   1   1   0   0      0    0   1   0
0   0   0   0   0      0    0   0   0
0   1   0   1   1      1    1   1   0
0   0   1   1   1      0    1   0   0
1   0   0   0   0      1    0   0   0
1   1   1   1   1      0    0   0   0

您会注意到,当原始列的值与前一列相比发生了更改时,新生成的列为1。例如,如果eg2的值与该行中的eg1的值相同,则eg2_m为0,否则eg2_m为1.如果eg3的值与eg2的值相同,则eg3_m值为0,否则eg3_m的值为1。

我有数百个这样的egX列,我不知道它们在DT中的位置。所以,我想通过名称向量引用列:

Colnames <- paste("eg", (1:500), sep = '')

我尝试了类似这样的东西,它不起作用(我知道它不算复杂)

for (i in 2:length(Colnames))

  result <- DT[, (paste(Colnames[i], '_m', sep = '')) := ifelse( 
    `Colnames[i]` < `Colnames[i-1]` 
    , 1,0)
    ]

我得到的错误是

  

对象'Colnames [i]'找不到

3 个答案:

答案 0 :(得分:2)

尝试:

> mydf[, .SD[, 1:(ncol(.SD)-1)] != .SD[, -1]] + 0L
     eg1 eg2 eg3 eg4
[1,]   0   0   1   0
[2,]   0   0   0   0
[3,]   1   1   1   0
[4,]   0   1   0   0
[5,]   1   0   0   0
[6,]   0   0   0   0

“mydf”定义为:

mydf <- structure(list(eg1 = c(1L, 0L, 0L, 0L, 1L, 1L), eg2 = c(1L, 0L,                               
         1L, 0L, 0L, 1L), eg3 = c(1L, 0L, 0L, 1L, 0L, 1L), eg4 = c(0L,                                     
         0L, 1L, 1L, 0L, 1L), eg5 = c(0L, 0L, 1L, 1L, 0L, 1L)), 
         .Names = c("eg1", "eg2", "eg3", "eg4", "eg5"), row.names = c(NA, 
         6L), class = c("data.table", "data.frame"))  

答案 1 :(得分:1)

使用Colnames:

Colnames <- paste("eg", (1:5), sep = '')
xx <- x[, Colnames, with = F]
xx <- (xx[, -1] != xx[, -ncol(xx), with = F]) + 0L
xx <- as.data.table(xx)
setnames(xx, paste0(colnames(xx), '_m'))
x <- cbind(x, xx)
x
#    eg1 eg2 eg3 eg4 eg5 eg2_m eg3_m eg4_m eg5_m
# 1:   1   1   1   0   0     0     0     1     0
# 2:   0   0   0   0   0     0     0     0     0
# 3:   0   1   0   1   1     1     1     1     0
# 4:   0   0   1   1   1     0     1     0     0
# 5:   1   0   0   0   0     1     0     0     0
# 6:   1   1   1   1   1     0     0     0     0

答案 2 :(得分:0)

试试这个:让X成为你的数据表(我的数据表填充了二项式变量)。

X <- matrix(rbinom(100,1,0.4),nrow=10)
X <- as.data.frame(X)

y <- X[,1:9] != X[,2:10]
y <- y + 0

然后相应地重命名y的colnames。