2017-10-12 2 views
0

df ist eine Liste von Tabellen (von HTML skaliert und als Listen gespeichert) Ich möchte in Datenrahmen konvertieren.Verwendung von lapply mit as.data.frame

as.data.frame(df[1]) 

funktioniert kein Problem. Doch sowohl

df_2 <- lapply(df, as.data.frame) 

und

df_3 <- lapply(df, function(x) { 

as.data.frame(x) 

}) 

nicht zu Datenrahmen konvertieren:

> class(df[1]) 
[1] "data.frame" 

> class(df_2[1]) 
[1] "list" 

> class(df_3[1]) 
[1] "list" 

Bearbeiten mit reproduzierbaren Beispiel:

a <- tribble(
+ ~ x, ~ y, 
+ 1, 2 
+) 
> b <- tribble(
+ ~ x, ~ y, 
+ 3, 4 
+) 
> a_list <- as.list(a) 
> b_list <- as.list(b) 
master_list <- list(a_list, b_list) 
a_df <- as.data.frame(master_list[1]) 

> class(a_df) 
[1] "data.frame" 
master_df <- lapply(master_list, as.data.frame) 
> class(master_df[1]) 
[1] "list" 
class(master_df[[1]]) 
[1] "data.frame" 

Tat [[]] wurde benötigt, um Container herauszufiltern ... aber diese st nicht krank nicht den ganzen Grund lösen, dies zu tun in meinem ursprünglichen Beispiel, die eine Funktion entfernt leere Zeilen aus jeder Tabelle zu nennen ist:

> clear_empty <- master_df[!apply(master_df == "", 1, all), ] 
Error in apply(master_df == "", 1, all) : 
    dim(X) must have a positive length 

Vielleicht werde ich eine andere Funktion, dies zu tun finden müssen, obwohl ich mochte die Einfachheit des einen oben.

+1

Könnten Sie ein reproduzierbares Beispiel geben ([MCVE])? –

+0

Auch 'lapply' gibt eine Liste zurück. Schwer zu sagen, ohne ein Beispiel zu sehen, aber Sie könnten versuchen, das Element mit '[[' 'anstelle von' ['' zu extrahieren. '[' 'extrahiert das Element, während '[' das Element und den Container (in diesem Fall wahrscheinlich eine Liste) –

+0

@MikeH extrahiert. Tatsächlich hatte ich das vergessen. – Albatrosspro

Antwort

1

können Sie mit dieser Lösung:

a <- tribble(
    ~ x, ~ y, 
    1, 2, 
    1,1, 
    '','', 
    1,'' 
    ) 
b <- tribble(
    ~ x, ~ y, 
    3, 4, 
    '',2, 
    4,'' 
    ) 
a_list <- as.list(a) 
b_list <- as.list(b) 
master_list <- list(a_list, b_list) 
nes_list <- lapply(master_list,function(x) { 
    x <- as.tibble(x) 
    x[x == ''] <- NA 
    # removing rows that have all NA 
    # x[rowSums(is.na(x)) != ncol(x),] 
    # remove rows that have at least one NA 
    # x[complete.cases(x),] 
}) 
+0

Danke, funktioniert super. – Albatrosspro

Verwandte Themen