【问题标题】:how to loop the dataframe using sqldf?如何使用 sqldf 循环数据帧?
【发布时间】:2018-06-09 21:31:22
【问题描述】:

第一个代码:

样本数据:

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

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

【问题讨论】:

    标签: r list dataframe sqldf


    【解决方案1】:

    OP 已请求帮助以使用 sqldf() 聚合存储在列表中的 data.frames。如果我理解正确的话,OP 想要计算每个 data.frame 中的男性和女性人数。

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

    正如我对上述问题的回答中所解释的,将具有相同结构的 data.frames 合并到一个大型 data.table 中几乎总是更好:

    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 列在像这样聚合时是无关紧要的,因此被忽略了。

    【讨论】:

    • 感谢您的详细解释。你按照我的要求来帮助我。
    【解决方案2】:

    您询问了 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
    

    【讨论】:

      【解决方案3】:

      sqldf::sqldf 指环境中存在的对象。因此,只需创建 DF &lt;- 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-12
        • 2017-08-16
        • 2013-11-21
        • 2020-05-23
        • 1970-01-01
        • 2021-10-15
        • 2020-06-09
        • 1970-01-01
        相关资源
        最近更新 更多