R sqldf loop и создать фрейм данных с именем на основе имени запроса

У меня есть фрейм данных 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

}

Но пока это не работает. Предложения?


person lmcshane    schedule 02.11.2016    source источник
comment
опечатка, исправлена ​​в dataframe   -  person lmcshane    schedule 03.11.2016


Ответы (2)


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

РЕДАКТИРОВАТЬ: должно работать.

person seasmith    schedule 02.11.2016

Рассмотрите возможность итерации по строкам, захватывая Query и Name каждой строки, чтобы создать фрейм данных, все они скомпилированы в список фреймов данных. Затем вы можете вывести в свою глобальную среду (или, еще лучше, оставить в списке):

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, передав каждый вектор столбца Query и Name:

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)
person Parfait    schedule 03.11.2016