如何使用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

.Ndata.table 语法中的一个特殊符号,它计算每个组中的行数。 name 列在这样聚合时是无关紧要的,因此被忽略了。