2017-02-11 7 views
1

Ich versuche, die gleiche Anzahl von Zeilen aus mehreren (28) Datenrahmen, jeder von unterschiedlicher Länge zu entfernen. Hier ist ein Spielzeug-Datensatz zu veranschaulichen, was ich meine:Entfernen/Bearbeiten von Zeilen aus mehreren Datenrahmen

df1 <- data.frame(
    var1 = c(1,2,3,4,5), 
    var2 = c(2,4,6,8,10) 
) 

df2 <- data.frame(
    var3 = c(1,2,3,4,5,6,7), 
    var4 = c(2,4,6,8,10,12,14) 
) 

df3 <- data.frame(
    var5 = c(1,2,3,4,5,6,7,8,9,10), 
    var6 = c(2,4,6,8,10,12,14,16,18,20) 
) 

ich eine Funktion geschrieben haben (siehe unten), dies zu tun, die sich auf einzelne Datenrahmen funktioniert:

remove_rows <- function(x){ 
    x[c(3:nrow(x)),] 
} 

Ich habe dann eine Liste erstellt der Datenrahmen mit df_list <- ls() und versuchte, die Funktion über jedes Element in der Liste mit lapply(df_list, function(x) remove_rows(x)) ausführen, aber ich bekomme immer wieder diesen Fehler: Error in 3:nrow(x) : argument of length 0.

Ich denke es ist, weil meine Funktion versucht, auf das Element innerhalb meiner Liste zu handeln, im Gegensatz zu dem Datenrahmen, den der Name des Elements in meiner Liste darstellt, aber ich kann nicht herausfinden, wie Sie es ändern.

Ich habe auch versucht, die Hacky-Ansatz einer for Schleife (unten), die auch versagt.

for (i in 1:length(df_list)){ 
    name <- df_list[i] 
    assign(name, remove_rows(df_list[i])) 
} 

Antwort

1

Verwenden Sie ein list und lapply Ihre Funktion über jeden Datenrahmen in der Liste:

> df_list <- list(df1, df2, df3) 
> new_df_list <- lapply(df_list, remove_rows) 
> new_df_list 
[[1]] 
    var1 var2 
3 3 6 
4 4 8 
5 5 10 

[[2]] 
    var3 var4 
3 3 6 
4 4 8 
5 5 10 
6 6 12 
7 7 14 

[[3]] 
    var5 var6 
3  3 6 
4  4 8 
5  5 10 
6  6 12 
7  7 14 
8  8 16 
9  9 18 
10 10 20 
+0

Danke, aber weil meine Datenframes alle unterschiedliche Namen haben (zB nicht nur df1, df2, df3, etc.)/Es gibt eine Menge von ihnen, ich kann nicht manuell eine Liste wie 'list (df1, df2, df3)' erstellen . – cstaff91

+0

Tatsächlich löste es mit [dieser Antwort] (http://stackoverflow.com/questions/14954399/put-multiple-data-frames-into-list-smart-way) – cstaff91

1

Wir mget verwenden können, um die Werte der Objekte in einem list und wenden Sie dann die remove_rows Funktion

df_list <- lapply(mget(paste0("df", 1:3)), remove_rows) 

Oder mit ls

df_list <- lapply(mget(ls(pattern = "df\\d+")), remove_rows) 
df_list 
#$df1 
# var1 var2 
#3 3 6 
#4 4 8 
#5 5 10 

#$df2 
# var3 var4 
#3 3 6 
#4 4 8 
#5 5 10 
#6 6 12 
#7 7 14 

#$df3 
# var5 var6 
#3  3 6 
#4  4 8 
#5  5 10 
#6  6 12 
#7  7 14 
#8  8 16 
#9  9 18 
#10 10 20 

Hinweis zu erhalten: zu Es ist besser, halten Sie mehrere Datensätze in einem list, aber wir können auch die ursprünglichen Objekte in der globalen Umgebung mit aktualisieren h list2env (allerdings nicht empfohlen)

list2env(df_list, .GlobalEnv) 
+0

So weil Mine in meinem eigentlichen Daten-Set alle Namen unterschiedlich sind, würde ich zu verwenden [diese Antwort] (http://stackoverflow.com/questions/14954399/put-multiple-data-frames-into-list-smart-way), aber das würde gut funktionieren, danke. – cstaff91

Verwandte Themen