在R中拆分数据帧时删除列

时间:2015-10-20 20:20:37

标签: r data.table

我正在尝试逐列拆分数据,但是一旦获得数据表列表,它们仍然包含数据表被拆分的列。拆分完成后,如何删除此列。或者更优选的是,我是如何删除多列的。

这是我的代码:

x <- rnorm(10, mean = 5, sd = 2)
y <- rnorm(10, mean = 5, sd = 2)
z <- sample(5, 10, replace = TRUE)
dt <- data.table(x, y, z)

split(dt, dt$z)

结果数据表子集看起来像

$`1`
          x        y z
1: 6.179790 5.776683 1
2: 5.725441 4.896294 1
3: 8.690388 5.394973 1

$`2`
          x        y z
1: 5.768285 3.951733 2
2: 4.572454 5.487236 2

$`3`
          x        y z
1: 5.183101 8.328322 3
2: 2.830511 3.526044 3

$`4`
          x        y z
1: 5.043010 5.566391 4
2: 5.744546 2.780889 4

$`5`
          x          y z
1: 6.771102 0.09301977 5

由于

2 个答案:

答案 0 :(得分:3)

除非你有一些花哨的并行化步骤,否则拆分data.table真的是不值得的。即便如此,你最好还是坚持使用一张桌子。

那就是说,我想你想要

split( dt[, !"z", with=FALSE], dt$z )

# or more generally

mysplitDT <- function(x, bycols) 
  split( x[, !bycols, with=FALSE], x[, bycols, with=FALSE] )

mysplitDT(dt, "z")

如果您有data.frame:

,则会遇到同样的问题
df = data.frame(dt)
split( df[-which(names(df)=="z")], df$z )

答案 1 :(得分:1)

首先想到的是遍历列表并删除z列。

lapply(split(dt, dt$z), function(d) { d$z <- NULL; d })

我刚刚注意到您使用的是data.table软件包,因此可能有更好的data.table方法来实现您想要的结果。