2014-11-24 65 views
4

背景加入,並添加列去

我是相當新的data.table庫,目前正在學習有效地使用它。我在這裏有兩個表格,我想先聚合第二個表格,然後將它與第一個表格合併並修改連接表格中的一列。理想(和我的理解)在一個去。

包版本

sessionInfo() 
# R version 3.1.0 (2014-04-10) 
# Platform: i386-w64-mingw32/i386 (32-bit) 

# attached base packages: 
# [1] stats  graphics grDevices utils  datasets methods base  

# other attached packages: 
# [1] data.table_1.9.4 

# loaded via a namespace (and not attached): 
# [1] chron_2.3-45 plyr_1.8.1 Rcpp_0.11.2 reshape2_1.4 stringr_0.6.2 
# [6] tools_3.1.0  

代碼

我已經試過可以在這個小例子可以看出:

library(data.table) 
set.seed(1) 
DT1 <- data.table(id = LETTERS[1:4], x = rnorm(4), key = "id") 
DT2 <- data.table(id = rep(LETTERS[1:4], each = 3), y = 1:12, z = rep(1, 12), key = "id") 
DT1[DT2[, lapply(.SD, mean), by = "id"]] # simple join works fine 
# id   x y z 
# 1: A -0.6264538 2 1 
# 2: B 0.1836433 5 1 
# 3: C -0.8356286 8 1 
# 4: D 1.5952808 11 1 

# however, adding a 'j' argument does not work 
DT1[DT2[, lapply(.SD, mean), by = "id"], x := -x] # (1) 

# in fact the above statement changes the 'x' column in 'DT1': 
DT1 
# id   x 
# 1: A 0.6264538 
# 2: B -0.1836433 
# 3: C 0.8356286 
# 4: D -1.5952808 

我猜想,這事做data.table如何處理數據(並且不進行復制)除非需要,所以請參考)。因此,下面的代碼工作:

DT3 <- copy(DT1[DT2[, lapply(.SD, mean), by = "id"]])[, x := -x] 
(DT4 <- DT1[DT2[, lapply(.SD, mean), by = "id"]][, x := -x]) # (2) 
# id   x y z 
# 1: A -0.6264538 2 1 
# 2: B 0.1836433 5 1 
# 3: C -0.8356286 8 1 
# 4: D 1.5952808 11 1 
identical(DT3, DT4) 
# [1] TRUE 

問題

  1. 是什麼做的 '最好' 的方法是什麼?在時間和記憶方面使用「最佳」?
  2. 這樣做的概念性方式是什麼?換句話說,Matt Dowle(軟件包維護者)會使用哪一系列命令?
  3. 爲什麼(1)不工作,而(2)按預期工作?
+0

我們應該經常問自己,WWMDD? – 2014-11-24 16:40:19

回答

3

與目前執行的問題(1)

DT1[DT2[, lapply(.SD, mean), by = "id"], x := -x] # (1) 

是,你是通過參考與x:=-x修改DT1,用的加入實際上沒有分配。

你想要的是(4)

DT3 <- DT1[DT2[, lapply(.SD, mean), by = "id"]][, x := -x] 

在這裏,一個額外的呼叫[上加入了數據集中意味着你分配到新創建的data.table x:=-x

除非確實需要,否則不需要顯式複製。

+0

感謝您的解釋。我認爲它與通過引用更改插槽有關。只是出於好奇:是否在(2)情況下複製'data.table'? – thothal 2014-11-25 06:55:59

+1

@thothal新數據。table是用'DT1 [DT2 [,lapply(.SD,mean),by =「id」]]'創建的,在copy中複製將複製這個新的數據表(據我所知) – mnel 2014-11-26 02:34:55

2

這裏是我如何與dplyr解決這個:

library("dplyr") 

set.seed(1) 
DT1 <- data_frame(id = LETTERS[1:4], x = rnorm(4), key = "id") 
DT2 <- data_frame(id = rep(LETTERS[1:4], each = 3), y = 1:12, z = rep(1, 12), key = "id") 

DT2 %>% 
    group_by(id) %>% 
    summarise_each(funs(mean), y:z) %>% 
    left_join(DT1) %>% 
    mutate(x = -x) 

(假設我正確地解釋你的data.table代碼)

+0

感謝您的選擇。其實,這是我的第一個代碼。但是,我只是想探索'data.table'選項來學習新的東西。 – thothal 2014-11-25 07:00:02