2015-10-20 28 views
0

我想按列拆分數據表,但是一旦我得到數據表的列表,它們仍然包含數據表被拆分的列。一旦分割完成,我將如何刪除此列。或者更好的是,有沒有辦法如何刪除多列。在分割數據框時刪除列R

這是我的代碼:

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 

感謝

+1

似乎有一個爲分割,使得沒有過載可以用很好的方式完成。但是,這似乎是最優化的解決方案 –

+1

幾乎從來沒有你需要這樣做...我很好奇你爲什麼需要它分裂。 – Arun

回答

1

浮現在腦海的第一件事就是通過列表和下降迭代z列。

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

而且我剛纔注意到您使用data.table包,所以有可能實現你想要的結果更好,data.table方式。

+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

我同意,將'data.table'拆分成一個列表將會(afaik)從'data.table'製作很多副本,並且對於大數據可能不會有效集。 – ialm

+0

但是,我如何實現以下目標:假設我有我的原始問題中定義的data.table,並且想從每個組中刪除異常值,只能通過拆分原始data.table 。 –

+2

@LaurynasStašys'DT [,{non_outliers < - ...; .SD [non_outliers]},by = z]'其中'...'是使用DT'的列來確定不是異常值的行的代碼。 data.table的設計與分組操作非常吻合。封裝的介紹性材料通過幾個示例說明了它的語法:https://github.com/Rdatatable/data.table/wiki/Getting-started – Frank