2016-11-15 28 views
0

編輯V2:修正了例子,增加了預期輸出R動態創建data.tables

我試圖根據兩個表動態地創建一堆數據表(子集)。第一個表,主數據集,包含所有的數據:

require(data.table) 
Doc_ID <- c(3631154, 3631545, 318801) 
document_type <- c('Customer Letter', 'Customer Letter', 'Refund Application') 
Pages <- c(2,12,53) 
dataset <- data.table (Doc_ID, document_type, Pages) 

第二個表包含創建動態表所需要的所有兩個參數 - 主數據集的非重疊子集。

document_type <- c('Customer Letter', 'Refund Application') 
MoreThan3SD <- c(2, 22) 
DocTableName <-c ('dt_Cust_Ltr', 'dt_Refund_App') 
sdset <- data.table(document_type, MoreThan3SD, DocTableName) 

我想要得到的,在概念上,像這樣的代碼行:

[sdset$DocTableName] <- dataset[document_type == sdset$document_type][Pages > sdset$MoreThan3SD][Pages > 0] 

到這樣的結果:

dt_Cust_Ltr <- dataset[document_type =='Customer Letter' & Pages > 2] 
dt_Refund_App <- dataset[document_type =='Refund Application' & Pages > 22] 

也就是說,是有辦法使用apply函數遍歷sdset中的每一行,以便根據每行sdset中的信息動態創建新表 - 就像將每行sdset迭代到SQL SELECT INTO查詢中一樣?

+1

你可能想給一個更具體的例子。如果這些子集不重疊,也許只是在大表中創建一個子集ID列或使用'split'(在當前的data.table版本中可用)。如果您使用該包,但不是很清楚,但是您標記了它...)如果這是一個分區。 – Frank

+1

用工作代碼編寫一個非常小的說明性示例 - 在表1中說10行數據,並說2表2的2行,並且清晰的期望輸出會使這是一個更好的問題。 – Gregor

+0

你可以給你期望的輸出嗎?這個概念上的例子甚至不運行 –

回答

1

試試這個:

library(data.table) 
Doc_ID <- c(3631154, 3631545, 318801) 
document_type <- c('Customer Letter', 'Customer Letter', 'Refund Application') 
Pages <- c(2,12,53) 
dataset <- data.table (Doc_ID, document_type, Pages) 

document_type <- c('Customer Letter', 'Refund Application') 
MoreThan3SD <- c(2, 22) 
DocTableName <-c ('dt_Cust_Ltr', 'dt_Refund_App') 
sdset <- data.table(document_type, MoreThan3SD, DocTableName) 

foo <- merge(dataset, sdset, by = "document_type")[Pages > MoreThan3SD] 
for (doc_table_name in unique(foo$DocTableName)) { 
    assign(doc_table_name, value = foo[DocTableName == doc_table_name, .(Doc_ID, document_type, Pages)]) 
} 

print(grep("dt", ls(), value = T)) 
print(dt_Cust_Ltr) 
print(dt_Refund_App) 

# > print(grep("dt", ls(), value = T)) 
# [1] "dt_Cust_Ltr" "dt_Refund_App" 
# > print(dt_Cust_Ltr) 
#  Doc_ID document_type Pages 
# 1: 3631545 Customer Letter 12 
# > print(dt_Refund_App) 
# Doc_ID  document_type Pages 
# 1: 318801 Refund Application 53 
+0

不,我正在嘗試爲sdset中的每一行創建一個表,其中表名爲sdset $ DocTableName,用於數據集匹配中的所有記錄sdset $ document_type,其中Pages> sdset $ MoreThan3SD,如果MoreThan3SD = 0,則最小頁數> 0。 –

+0

您能否提供您需要的data.table輸入和輸出數據表...抱歉,但是頭腦變得越來越累來解釋你的句子:) –

+0

輸入在前兩個代碼塊中提供 - 分別創建數據集和sdset。所需的輸出在第4個代碼塊中提供,它創建了dt_Cust_Ltr和dt_Refund_App –