【问题标题】:R sqldf loop and create data frame named based on query nameR sqldf循环并创建基于查询名称命名的数据框
【发布时间】:2017-03-16 10:16:25
【问题描述】:

我有想要在另一个数据帧上执行的 SQL 查询的数据帧。

queries <- structure(list(Name = c("innovation", "foos", "testing"), A = c("select * from data WHERE `TEXT` RLIKE '[[:<:]]innovat[^[:space:]]+[[:>:]]'", "select * from data WHERE `TEXT` RLIKE '[[:<:]]foo[^[:space:]]+[[:>:]]'", "select * from data WHERE `TEXT` RLIKE '[[:<:]]test[^[:space:]]+[[:>:]]'"), B = c("", "b", "b"), C = c("c", "c", "c")), .Names = c("Name", "Query", "Q1_2", "Q1_3"), row.names = c(NA, -3L), class = "data.frame")

我想使用 sqldf 包遍历这些查询,并将每个查询的数据框输出命名为在数据框查询中找到的对应名称。我还需要在每个数据框中创建一个与数据框名称匹配的新变量。

样本数据集

data <- structure(list(Participant = 1:3, A = c("and other foo things", "testing test and foo", "nothing here"), B = c("", "b", "b"), C = c("c", "c", "c")), .Names = c("Participant", "TEXT", "other", "another"), row.names = c(NA, -3L), class = "data.frame")

类似:

for (i in queries[2]) {
  i<- as.data.frame(sqldf(i)
                      i$category <- i

}

但这还不行。有什么建议吗?

【问题讨论】:

  • 错字,已更正为数据数据框

标签: r loops sqldf


【解决方案1】:

df <- lapply(queries[[2]], sqldf) names(df) <- queries[[1]]

编辑:应该可以。

【讨论】:

    【解决方案2】:

    考虑逐行迭代,捕获每一行的 QueryName 以创建一个数据框,所有这些都编译成一个数据框列表。然后您可以输出到您的全局环境(或者更好的是,保留在列表中):

    dfList <- lapply(seq_len(nrow(queries)), function(i){
      df <- sqldf(queries$Query[i])
      df$Category <- queries$Name[i]
      return(df)
    })    
    names(dfList) <- queries$Name
    
    list2env(dfList, envir = .GlobalEnv)
    

    或者,使用mapply的包装器Map,传入每个QueryName列向量:

    handler <- function(x, y) {
        df <- sqldf(x)
        df$Category <- y
        return(df)
    }
    dfList <- Map(handler, queries$Query, queries$Name)
    names(dfList) <- queries$Name
    
    list2env(dfList, envir = .GlobalEnv)
    

    【讨论】:

      猜你喜欢
      • 2016-11-09
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      相关资源
      最近更新 更多