R动态创建data.tables

时间:2016-11-15 22:45:22

标签: r

编辑V2:修复了示例,添加了预期输出

我正在尝试基于两个表动态创建一堆数据表(子集)。第一个表是主数据集,包含所有数据:

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 个答案:

答案 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