2016-04-25 33 views
1

如何使一個data.table具有大部分數值,只轉換一列的子集並將它們放回原始數據表?通常,我不想將任何彙總統計信息作爲單獨的列添加,只需交換已轉換的統計信息即可。data.table:用函數逐行轉換列的子集

假設我們有一個DT。它有1列名稱和10列數值。我對基數R的「縮放」函數對該數據表的每一行感興趣,但僅適用於這10個數字列。

並在此擴展。如果我有一個包含更多列的數據表,並且我需要使用列名稱來說明應用該函數的數據點的縮放函數?

通過定期data.frame我只想做:

df[,grep("keyword",colnames(df))] <- t(apply(df[,grep("keyword",colnames(df))],1,scale)) 

我知道這看起來繁瑣,但總是爲我工作。但是,我無法找到在data.tables中執行此操作的簡單方法。

我會像這樣的事情,爲data.tables工作:

dt[,grep("keyword",colnames(dt)) := scale(grep("keyword",colnames(dt)),center=F)] 

但事實並非如此。

編輯:

做的另一個例子,更新列與他們的每行縮放版本:

DT = data.table對象

dt[,grep("keyword",colnames(dt),value=T) := as.data.table(t(apply(dt[,grep("keyword",colnames(dt)),with=F],1,scale)))] 

它需要「爲太糟糕.data.table「部分,因爲來自apply函數的轉置值是一個矩陣。在更新列時,data.table可能會自動將矩陣強制轉換爲data.tables?

回答

2

如果你需要的是真正的規模由行,你可以嘗試在2個步驟做:

# compute mean/sd: 
mean_sd <- DT[, .(mean(unlist(.SD)), sd(unlist(.SD))), by=1:nrow(DT), .SDcols=grep("keyword",colnames(DT))] 

# scale 
DT[, grep("keyword",colnames(DT), value=TRUE) := lapply(.SD, function(x) (x-mean_sd$V1)/mean_sd$V2), .SDcols=grep("keyword",colnames(DT))] 
+0

感謝您的幫助!你認爲有一種更短的(或單行)的方式來做到這一點?鑑於任務的簡單性,似乎有點精細。 –

+1

@PiotrGrabowski,很高興如果它幫助你,我不明白你爲什麼刪除了你的問題。這可能對其他人有幫助。這可能可能是單線,但我認爲這會使代碼不太清晰。 – Cath

+0

我刪除了它,因爲我得到了一個downvote,所以我認爲這個問題是低「質量」可以這麼說。不過,我還發現了一種做我正在尋找的方法,我將追加到我原來的帖子中。謝謝! –