我有一个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]'找不到
答案 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。