如何使用sqldf循环数据框?

时间:2017-12-29 12:28:21

标签: r list dataframe 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]来进行测试,但它不会返回这样的表或语法错误。在循环函数中,我可以访问数据框。是否可以使用这种格式?

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

是否可以使用第一个代码访问列表?当我想使用粘贴功能访问列表中的每个数据框时,如何解决它。

3 个答案:

答案 0 :(得分:1)

mergeProperties指的是环境中存在的对象。因此,只需创建sqldf::sqldf并在查询中使用此名称。

DF <- list[[i]]

答案 1 :(得分:1)

您询问是否使用了lapply,这将消除使用for循环处理数据帧列表的需要。下面是一个解决方案,它使用一个简单的独立函数将sqldf语句应用于给定的数据帧,然后将其应用于数据帧列表而不显式循环:

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

答案 2 :(得分:1)

OP已经请求帮助使用sqldf()来聚合存储在列表中的data.frames。如果我理解正确,OP希望计算每个数据框内的男性和女性个体数量。

OP已经提出了两个相关问题("using lapply function and list in r ""add missed value based on the value of the column in r "),他们也在寻求帮助来处理data.frames列表。

正如我在上述问题的答案中所解释的那样,将data.frames与相同结构组合在一个大数据中几乎总是更好。表:

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列无关紧要,因此被忽略了。