r - 创建从 R 中带有参数的函数创建的 dataframes/data.tables 列表?
问题描述
我对使用函数和循环的效率 R 代码印象深刻。
我将首先提供一个简化的问题示例,并解释我的问题(代码可能无法复制)。
如果我有几个内容和长度不同的向量,例如:
tables_vector_1 <- c(1,2,3)
tables_vector_2 <- c(1:10)
我有一个从向量创建 data.tables 的函数,比如:
create_dt <- function(tables_vector, i){
DT <- data.table(id = 1:i, name = c("a","b","c"))
return(DT)
}
我想知道,如果有办法编写循环或函数,我可以通过运行之前创建的函数在向量中创建所有(或部分)data.tables?
(大概喜欢)
for i in 1:length(tables_vector){
create_dt(tables_vector, i)
}
然后将结果合并到一个列表中,与运行时的结果相同:
list(create_dt(tables_vector_1,1),create_dt(tables_vector_1,2),create_dt(tables_vector_1,3))
我曾尝试使用lapply(list(1:3),create_dt,tables_vector = tables_vector_1, i)
,但它失败了,因为我不知道如何i
在lapply()
.
这是为什么会出现这个问题的解释:
在实际情况中,我创建了一个从数据库导入 data.table 的函数:
import_data <- function(tables_vector,i){
end <- Sys.time()
start <- end - 7200
con <- dbConnect("PostgreSQL", dbname="db", host = "host", user=db_user, password=db_password)
query <- sprintf("SELECT %s.timeutc, %s.scal AS %s FROM %s WHERE timeutc BETWEEN '%s' AND '%s' AND mode='General';",
tables_vector[i],tables_vector[i],tables_vector[i], tables_vector[i],start,end)
rs <- dbSendQuery(con, query)
df <- fetch(rs, n = -1)
dbClearResult(rs)
dbDisconnect(con)
return(as.data.table(df))
}
而且我有数十个由组定义的向量(例如,vector1 包含用于目的 1 的通道,vector2 包含用于目的 2 的通道)。
由于它们是为不同的分析目的而创建的,因此我不能简单地将它们组合在一个向量中。
而且,有些向量包含7、8个通道,因此通过一个一个重复函数来列出它们是很烦人的。
解决方案
像这样的东西怎么样:
tables_vector_1 <- c(1,2,3)
tables_vector_2 <- c(1:10)
create_dt <- function(tables_vector, i){
DT <- data.table(id = 1:i, name = letters[1:i])
return(DT)
}
make_list <- function(x){
lapply(seq_along(x), function(i)create_dt(x, i))
}
make_list(tables_vector_1)
[[1]]
id name
1: 1 a
[[2]]
id name
1: 1 a
2: 2 b
[[3]]
id name
1: 1 a
2: 2 b
3: 3 c
make_list(tables_vector_2)
[[1]]
id name
1: 1 a
[[2]]
id name
1: 1 a
2: 2 b
[[3]]
id name
1: 1 a
2: 2 b
3: 3 c
[[4]]
id name
1: 1 a
2: 2 b
3: 3 c
4: 4 d
[[5]]
id name
1: 1 a
2: 2 b
3: 3 c
4: 4 d
5: 5 e
[[6]]
id name
1: 1 a
2: 2 b
3: 3 c
4: 4 d
5: 5 e
6: 6 f
[[7]]
id name
1: 1 a
2: 2 b
3: 3 c
4: 4 d
5: 5 e
6: 6 f
7: 7 g
[[8]]
id name
1: 1 a
2: 2 b
3: 3 c
4: 4 d
5: 5 e
6: 6 f
7: 7 g
8: 8 h
[[9]]
id name
1: 1 a
2: 2 b
3: 3 c
4: 4 d
5: 5 e
6: 6 f
7: 7 g
8: 8 h
9: 9 i
[[10]]
id name
1: 1 a
2: 2 b
3: 3 c
4: 4 d
5: 5 e
6: 6 f
7: 7 g
8: 8 h
9: 9 i
10: 10 j
请注意,我更改了create_dt()
功能,因此它不会产生警告,但机制仍应按预期工作。
推荐阅读
- r - 图形节点颜色取决于权重
- echarts - Echarts - 画布外的滚动条
- php - 根据数组值动态放置数组条件
- mysql - 如何禁用选择(读取)语句记录在 mysql 通用日志表中?
- angular - 来自登录页面的 Angular 隐藏导航栏菜单
- javascript - android输入键事件在jquery中不起作用
- amazon-web-services - 如何将 s3 数据从一个 EMR 集群读取到另一个 EMR 集群?
- r - 我在 R 中收到 nlme 包的功能错误
- python - 在 Python 中的进程之间共享列表的正确方法?
- react-native - React 本机应用程序需要时间来加载资产?