2017-12-29 11 views
1

Erster Code:wie der Datenrahmen mit sqldf Schleife?

Datenprobe:

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 ")) 
} 

Wie Schleife der Datenrahmen korrekt mit sqldf Funktion? Ich habe versucht, Liste [[1]] oder Liste [1] in der Funktion sqldf, um den Test zu tun, aber es wird keine solche Tabelle oder Syntaxfehler zurückgegeben. In der Schleifenfunktion kann ich auf den Datenrahmen zugreifen. Ist es möglich, dieses Format zu verwenden?

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 

Zweitens:

Dieser Code ist meine Erwartung.

f<- lapply(list, function(dataframe) { 
     sql <- 
     sqldf("select name,gender,count(name) from dataframe group by gender ") 
    }) 
    print(f) 

Dies ist der Ausgang.

> 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 

Ist es möglich, den ersten Code zu verwenden, um auf die Liste zuzugreifen? Wie behebe ich es, wenn ich die Einfügefunktion verwenden möchte, um auf jeden Datenrahmen in einer Liste zuzugreifen.

Antwort

1

sqldf::sqldf bezieht sich auf das in der Umgebung vorhandene Objekt. Erstellen Sie einfach DF <- list[[i]] und verwenden Sie diesen Namen in der Abfrage.

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 
1

Sie fragte über die Verwendung von lapply, die mit der Notwendigkeit abschaffen wird eine for-Schleife zu verwenden, um Ihre Liste von Datenrahmen zu verarbeiten. Hier ist eine Lösung, die eine einfache Stand-alone-Funktion mit der sqldf Anweisung auf einen bestimmten Datenrahmen anzuwenden und lapply es ohne ausdrücklichen Looping in der Liste des Datenrahmen anzuwenden:

namecount <- function(df){ 
    sqldf("select name, gender, count(name) from df group by gender") 
} 

sql = lapply(list, namecount) 

Ausgang:

> 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 
+0

danke für Ihren Unterricht. Es ist ein schneller Weg. – hahakwok

1

Das OP hat um Hilfe gebeten, sqldf() zu verwenden, um data.frames zu aggregieren, die in einer Liste gespeichert sind. Wenn ich richtig verstanden habe, möchte das OP die Anzahl männlicher und weiblicher Individuen in jedem Datenrahmen zählen.

Das OP hat zwei verwandte Fragen gestellt ("using lapply function and list in r " und "add missed value based on the value of the column in r "), wo er auch Hilfe bei der Verarbeitung einer Liste von data.frames sucht.

Wie in meinen Antworten auf diese Fragen ist es fast immer besser ist data.frames mit identische Struktur in einem großen data.table zu kombinieren:

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 

Beachten Sie, dass Die zusätzliche Spalte df identifiziert den Ursprung jeder Zeile.

Jetzt können wir leicht die Anzahl der Zeilen von gender zählen für jede df von

rbindlist(list, idcol = "df")[, .N, by = .(df, gender)] 
df gender N 
1: 1  m 1 
2: 2  m 1 
3: 3  f 1 

.N ein spezielles Symbol in data.table Syntax, die die Anzahl der Zeilen in jeder zählt Gruppe. Die name Spalte ist irrelevant, wenn sie so aggregiert und deshalb vernachlässigt wurde.

+0

Vielen Dank für Ihre ausführliche Erklärung. Du folgst dem, was ich frage und hilfst mir. – hahakwok