2017-12-16 5 views
1
d1 <- data.frame(col_one = c(1,2,3),col_two = c(4, 5, 6)) 
d2 <- data.frame(col_one = c(1, 1, 1), col_two = c(6, 5, 4)) 
d3 <- data.frame(col_one = c(7, 1, 1), col_two = c(8, 5, 4)) 
my.list <- list(d1, d2,d3) 

for (i in 1:3) { 
    table<- lapply(my.list, function(data, count) { 
    sql <- 
     #sqldf(
     paste0(
      "select *,count(col_one) from data where col_one = ", 
      count," group by col_one" 
     ) 
     #) 
    print(sql) 
    }, 
    count = i) 
} 

Ausgang:mit lapply Funktion und Liste in r

[1] "select *,count(col_one) from data where col_one = 1 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 1 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 1 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 2 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 2 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 2 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 3 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 3 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 3 group by col_one" 

Erwartung:

[1] "select *,count(col_one) from data where col_one = 1 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 2 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 3 group by col_one" 

Wie konnte ich verbessern? Ich hoffe, SQL auszuführen, um ein neues Dataset zu erstellen, was ich will, aber es ist nicht erfolgreich, und ich kann angeben, den Index der Liste zu wissen, die sich auf die SQL-Anweisung bezieht. Gibt es eine andere einfache Methode?

Ich habe eine der Methoden ausprobiert.

d1 <- data.frame(col_one = c(1,2,3),col_two = c(4, 5, 6)) 
d2 <- data.frame(col_one = c(3, 2, 1), col_two = c(6, 5, 4)) 
d3 <- data.frame(col_one = c(7, 2, 1), col_two = c(8, 5, 4)) 
my.list <- list(d1, d2,d3) 
seq_along(x) 
#for (i in 1:3) { 
    table<- lapply(seq_along(my.list), function(index) { 
    sql <- 
     sqldf(
     paste0(
      "select *,count(col_one) from my.list where col_one = ", 
      index," group by col_one" 
     ) 
    ) 
    print(sql) 
    }) 
#} 

Ausgang:

[1] "select *,count(col_one) from my.list where col_one = 1 group by col_one" 
[1] "select *,count(col_one) from my.list where col_one = 2 group by col_one" 
[1] "select *,count(col_one) from my.list where col_one = 3 group by col_one" 

aber es wird nicht den Datensatz finden SQL auszuführen.

d1 <- data.frame(col_one = c(1,2,3),col_two = c(4, 5, 6)) 
d2 <- data.frame(col_one = c(1, 1, 1), col_two = c(6, 5, 4)) 
d3 <- data.frame(col_one = c(7, 1, 1), col_two = c(8, 5, 4)) 
my.list <- list(d1, d2,d3) 
table<- mapply(function(data, count) { 
    sql <- 
    sqldf(
    paste0(
     "select *,count(col_one) from data where col_one = ", 
     count," group by col_one" 
    ) 
) 
    print(sql) 
}, my.list, 1 
) 
+0

Sind Sie versuchen, die Zeilen aller Datenrahmen zusammen mit zusätzlichen Spalten für den Index in 'my.list' und der Zeilenanzahl von jedem zu binden? 'do.call (" rbind ", lapply (seq_along (meine.liste), funktion (i) cbind (Index = i, Anzahl = nrow (meine.liste [[i]]), meine.liste [[i]]))) ' –

Antwort

1

Wenn ich richtig verstanden habe, will die OP Kreuztabellen für col_one für jede der Daten erstellen. Frames in my.list, dh er möchte wissen, wie oft jeder der Werte 1, 2 oder 3 in col_one in jedem data.frame erscheint.

Wie in my answer-another question of the OP und wie G. Grothendieck vorgeschlagen, ist es fast immer besser data.frames mit identischer Struktur in einem großen data.table zu kombinieren, als sie in einer Liste getrennt zu halten. BTW, es gibt auch eine dritte question ("how to loop the dataframe using sqldf?") vom OP um Hilfe mit einer Liste von data.frames bitten.

Um die data.frames in einer großen data.table zu kombinieren, wird die rbindlist()-Funktion verwendet. Beachten Sie, dass die hinzugefügte ID-Spalte df das ursprüngliche data.frame jeder Zeile identifiziert.

library(data.table) 
rbindlist(my.list, idcol = "df") 
df col_one col_two 
1: 1  1  4 
2: 1  2  5 
3: 1  3  6 
4: 2  1  6 
5: 2  1  5 
6: 2  1  4 
7: 3  7  8 
8: 3  1  5 
9: 3  1  4 

Jetzt können wir leicht die Aggregate berechnen:

rbindlist(my.list, idcol = "df")[, count_col_one := .N, by = .(df, col_one)][] 
df col_one col_two count_col_one 
1: 1  1  4    1 
2: 1  2  5    1 
3: 1  3  6    1 
4: 2  1  6    3 
5: 2  1  5    3 
6: 2  1  4    3 
7: 3  7  8    1 
8: 3  1  5    2 
9: 3  1  4    2 

Diese data.table Aussage zählt die Ereignisse eines jeden einzelnen Wert in col_one für jede df unter Verwendung des speziellen Symbols .N und durch Gruppierung nach df und col_one.

In der Frage hat das OP nur gebeten, die Vorkommen von 1, 2 oder 3 in col_one zu zählen. Wenn dies wirklich beabsichtigt ist, muss der Wert 7 entfernt werden.Dies kann durch die Filterung des Ergebnisses erreicht werden:

rbindlist(my.list, idcol = "df")[, count_col_one := .N, by = .(df, col_one)][ 
    col_one %in% 1:3] 
1

Sie müssen über data und counts gleichzeitig iterieren. In tidyverse würde ich purrr empfehlen :: map2(), aber in der Basis R können Sie einfach tun:‘

table<- mapply(function(data, count) { 
    sql <- 
     #sqldf(
     paste0(
     "select *,count(col_one) from data where col_one = ", 
     count," group by col_one" 
    ) 
    #) 
    print(sql) 
    }, my.list, 1:3 
) 
[1] "select *,count(col_one) from data where col_one = 1 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 2 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 3 group by col_one" 
+0

Danke für Ihre Hilfe. Ich habe die neue Funktion gelernt, da ich nicht weiß, nach welchen Schlüsselwörtern ich suchen soll. Wie könnte ich den Index der Liste angeben, die den zugehörigen Wert enthält? weil der Wert nach dem Ausführen der SQL getrennt wird. Zum Beispiel sollten nach dem Ausführen der SQL-Anweisung die ersten drei Elemente eine Liste sein, um sie zusammen zu speichern. Ich bearbeite den Inhalt, weil ich den Code im Kommentar nicht formatieren kann. @ dmi3kno – hahakwok

+0

Nicht sicher, ich verstehe, was du meinst. Könnten Sie bitte versuchen, die Frage neu zu formulieren? – dmi3kno

+0

Ich bearbeite die Frage, entschuldige mich zu spät, da ich denke, wie ich die Frage ausdrücken soll. Könnte ich jede SQL-Anweisung zu einem Datenrahmen machen und eine Liste erstellen? Ist es 2d Liste? Ich bin ein Anfänger. @ dmi3kno – hahakwok