如何使用sqldf循环数据帧?
how to loop the dataframe using sqldf?
第一个代码:
示例数据:
vector1 <- data.frame("name"="a","age"=10,"gender"="m")
vector2 <- data.frame("name"="b","age"=33,"gender"="m")
vector3 <- data.frame("name"="b","age"=58,"gender"="f")
list <- list(vector1,vector2,vector3)
sql <- list()
for(i in 1:length(list)){
print(list[[1]]) # access dataframe
sql[[i]]<-
sqldf(paste0("select name,gender,count(name) from ",list[[i]]," group by gender "))
}
如何使用sqldf函数正确循环数据框?我已尝试在 sqldf 函数中使用 list[[1]] 或 list[1] 进行测试,但它会 return no such table 或语法错误。在循环函数中,我可以访问数据框。可以使用这种格式吗?
print(str(list))
List of 3
$ :'data.frame': 1 obs. of 3 variables:
..$ name : Factor w/ 1 level "a": 1
..$ age : num 10
..$ gender: Factor w/ 1 level "m": 1
$ :'data.frame': 1 obs. of 3 variables:
..$ name : Factor w/ 1 level "b": 1
..$ age : num 33
..$ gender: Factor w/ 1 level "m": 1
$ :'data.frame': 1 obs. of 3 variables:
..$ name : Factor w/ 1 level "b": 1
..$ age : num 58
..$ gender: Factor w/ 1 level "f": 1
NULL
第二个:
这段代码是我的期望。
f<- lapply(list, function(dataframe) {
sql <-
sqldf("select name,gender,count(name) from dataframe group by gender ")
})
print(f)
这是输出。
> print(f)
[[1]]
name gender count(name)
1 a m 1
[[2]]
name gender count(name)
1 b m 1
[[3]]
name gender count(name)
1 b f 1
是否可以使用第一个代码访问列表?当我想使用粘贴功能访问列表中的每个数据框时如何修复它。
sqldf::sqldf
指的是环境中存在的对象。因此,只需创建 DF <- list[[i]]
并在查询中使用此名称即可。
for(i in 1:length(list)){
print(list[[1]]) # access dataframe
DF <- list[[i]]
sql[[i]]<- sqldf("select name,gender,count(name) from DF group by gender ")
}
print(sql)
# [[1]]
# name gender count(name)
# 1 a m 1
#
# [[2]]
# name gender count(name)
# 1 b m 1
#
# [[3]]
# name gender count(name)
# 1 b f 1
您询问了 lapply 的使用,这将消除使用 for 循环处理数据帧列表的需要。这是一个解决方案,它使用一个简单的独立函数将 sqldf 语句应用于给定的数据帧,lapply 将其应用于您的数据帧列表而无需显式循环:
namecount <- function(df){
sqldf("select name, gender, count(name) from df group by gender")
}
sql = lapply(list, namecount)
输出:
> sql
[[1]]
name gender count(name)
1 a m 1
[[2]]
name gender count(name)
1 b m 1
[[3]]
name gender count(name)
1 b f 1
OP 请求帮助使用 sqldf()
聚合存储在列表中的 data.frames。如果我理解正确的话,OP 想要计算每个 data.frame.
中男性和女性的数量
OP 问了两个相关问题("using lapply function and list in r
" and "根据r中列的值添加缺失值
“) 他也在寻求帮助处理 data.frames.
列表
正如我在对上述问题的回答中所解释的,将 data.frames 与 相同的结构 结合在一个大 data.table:[=23 中几乎总是更好=]
library(data.table)
rbindlist(list, idcol = "df")
df name age gender
1: 1 a 10 m
2: 2 b 33 m
3: 3 b 58 f
请注意,附加的 df
列标识了每行的来源。
现在,我们可以很容易地通过gender
计算行数,每个df
通过
rbindlist(list, idcol = "df")[, .N, by = .(df, gender)]
df gender N
1: 1 m 1
2: 2 m 1
3: 3 f 1
.N
是 data.table
语法中的一个特殊符号,它计算每个组中的行数。 name
列在这样聚合时是无关紧要的,因此被忽略了。
第一个代码:
示例数据:
vector1 <- data.frame("name"="a","age"=10,"gender"="m")
vector2 <- data.frame("name"="b","age"=33,"gender"="m")
vector3 <- data.frame("name"="b","age"=58,"gender"="f")
list <- list(vector1,vector2,vector3)
sql <- list()
for(i in 1:length(list)){
print(list[[1]]) # access dataframe
sql[[i]]<-
sqldf(paste0("select name,gender,count(name) from ",list[[i]]," group by gender "))
}
如何使用sqldf函数正确循环数据框?我已尝试在 sqldf 函数中使用 list[[1]] 或 list[1] 进行测试,但它会 return no such table 或语法错误。在循环函数中,我可以访问数据框。可以使用这种格式吗?
print(str(list))
List of 3
$ :'data.frame': 1 obs. of 3 variables:
..$ name : Factor w/ 1 level "a": 1
..$ age : num 10
..$ gender: Factor w/ 1 level "m": 1
$ :'data.frame': 1 obs. of 3 variables:
..$ name : Factor w/ 1 level "b": 1
..$ age : num 33
..$ gender: Factor w/ 1 level "m": 1
$ :'data.frame': 1 obs. of 3 variables:
..$ name : Factor w/ 1 level "b": 1
..$ age : num 58
..$ gender: Factor w/ 1 level "f": 1
NULL
第二个:
这段代码是我的期望。
f<- lapply(list, function(dataframe) {
sql <-
sqldf("select name,gender,count(name) from dataframe group by gender ")
})
print(f)
这是输出。
> print(f)
[[1]]
name gender count(name)
1 a m 1
[[2]]
name gender count(name)
1 b m 1
[[3]]
name gender count(name)
1 b f 1
是否可以使用第一个代码访问列表?当我想使用粘贴功能访问列表中的每个数据框时如何修复它。
sqldf::sqldf
指的是环境中存在的对象。因此,只需创建 DF <- list[[i]]
并在查询中使用此名称即可。
for(i in 1:length(list)){
print(list[[1]]) # access dataframe
DF <- list[[i]]
sql[[i]]<- sqldf("select name,gender,count(name) from DF group by gender ")
}
print(sql)
# [[1]]
# name gender count(name)
# 1 a m 1
#
# [[2]]
# name gender count(name)
# 1 b m 1
#
# [[3]]
# name gender count(name)
# 1 b f 1
您询问了 lapply 的使用,这将消除使用 for 循环处理数据帧列表的需要。这是一个解决方案,它使用一个简单的独立函数将 sqldf 语句应用于给定的数据帧,lapply 将其应用于您的数据帧列表而无需显式循环:
namecount <- function(df){
sqldf("select name, gender, count(name) from df group by gender")
}
sql = lapply(list, namecount)
输出:
> sql
[[1]]
name gender count(name)
1 a m 1
[[2]]
name gender count(name)
1 b m 1
[[3]]
name gender count(name)
1 b f 1
OP 请求帮助使用 sqldf()
聚合存储在列表中的 data.frames。如果我理解正确的话,OP 想要计算每个 data.frame.
OP 问了两个相关问题("using lapply function and list in r " and "根据r中列的值添加缺失值 “) 他也在寻求帮助处理 data.frames.
列表正如我在对上述问题的回答中所解释的,将 data.frames 与 相同的结构 结合在一个大 data.table:[=23 中几乎总是更好=]
library(data.table)
rbindlist(list, idcol = "df")
df name age gender 1: 1 a 10 m 2: 2 b 33 m 3: 3 b 58 f
请注意,附加的 df
列标识了每行的来源。
现在,我们可以很容易地通过gender
计算行数,每个df
通过
rbindlist(list, idcol = "df")[, .N, by = .(df, gender)]
df gender N 1: 1 m 1 2: 2 m 1 3: 3 f 1
.N
是 data.table
语法中的一个特殊符号,它计算每个组中的行数。 name
列在这样聚合时是无关紧要的,因此被忽略了。