2016-05-24 3 views
1

Der Versuch, eine Operation für jede Spalte in einem Datenrahmen durchzuführen. Nicht sicher, apply oder for zu verwenden (nicht sicher, wie die erste Spalte in apply ignoriert wird).R for loop oder Anwendung auf Datentabellenspalten

Frage 1:

einfach jeden Namen druckt zweimal Ich finde heraus:

for (i in names(dt)){if(str_length(i) < 3) {print(i);print(i)}}

Die erste Name der Spalte ist das einzige mit einer String-Länge> 3 weshalb I benutzt das.

Ich habe versucht, mit:

for (i in dt$i){if(str_length(names(i)) < 3) {print(i);print(i)}} 
for (i in dt$i){if(str_length(names(dt)) < 3) {print(i);print(i)}} 

einfach jede Spalte zweimal drucken, aber es erzeugt nur einen leeren Wert.

Frage 2:

Was ich tatsächlich statt Druck zu tun zweimal; ist Reihenfolge jeder Spalte: order(-i) ??

Dann erstellen Sie eine Teilmenge: head(i, n=500) ??

Nicht sicher, ob dies ein zusätzlicher Schritt oder eine Erweiterung des obigen Schritts ist. Dann definiere das als data.frame; dt(i) < data.frame(head(i, n=500)) ??

Dann speichern Sie diese Tabelle: write.csv(dt(i), "newfolder/i.csv", row.names = FALSE) - Ich denke, das wird nur ständig eine Datei namens i.csv überschreiben, nicht sicher, wie ich die Datei basierend auf i nennen würde.

Vielleicht apply ist ein besserer Ansatz, ich bin mir nicht sicher.

I einfachste Annäherung (so dass ich verstehe, was los ist) würde geschätzt werden. Ich habe nur 40 Spalten mit jeweils 50.000 Reihen, also sollte es nicht so langsam sein.

EDIT

Der Versuch, mehr klar zu sein, ich werde ein Beispiel hinzufügen:

Name Math Science PE 
David 90 70 25 
Tom 100 60 40 
John 30 40 100 

Ich möchte mit 3 csv ist mit dem ersten bis zum Ende aussehen wie:

Name Math 
Tom 100 
David 90 

Im obigen Fall ist n = 2 für den Kopf. Auch die CSV könnte die anderen Spalten haben, aber sie sind nicht erforderlich.

+1

'nicht sicher, wie ich die Datei basierend auf i nennen würde .' - benutze 'paste0 (" myFile ", ich," .csv ")' – zx8754

+2

Dein Beitrag ist nicht sehr klar und vielleicht geschlossen als zu breit. Bitte fügen Sie Eingabedaten und erwartete Ausgabe hinzu. 'apply' ist nur eine verschönerte Version von' for loop', also liegt es an Ihnen, welche Sie verwenden. – zx8754

+0

War meine Bearbeitung genug Informationen? –

Antwort

3

Ihre Dummy-Daten verwenden, können wir eine Schleife durch „Subjekt“ Spalten 2: n, dann sortieren und schreiben Top-2 Ergebnisse:

# dummy data 
df <- read.table(text="Name Math Science PE 
David 90 70 25 
Tom 100 60 40 
John 30 40 100", header = TRUE) 


# loop and write csv for top 2 scores 
lapply(colnames(df)[2:ncol(df)], function(i){ 
    res <- df[, c("Name", i)] 
    res <- res[order(res[, i], decreasing = TRUE),] 
    write.csv(head(res, 2), file = paste0(i, ".csv")) 
}) 
2

Versuchen Sie so etwas wie diese (mit mtcars als Beispiel):

mtcars[] <- lapply(mtcars, sort) 
head(mtcars) 

Hier legen Sie jede Spalte von kleinstem sortieren größten zu. Beachten Sie, dass jede einzelne Zeile nicht mehr nützlich ist, da sie keine bestimmte Einheit darstellt. Sie erhalten jedoch Ihre gewünschte Ausgabe. Dann können Sie einfach head() verwenden, um Ihre gewünschte Anzahl an Einträgen zu erhalten.

Um zu sehen, was passiert:

Erstens, wie die ursprünglichen Daten sehen:

> head(mtcars) 
        mpg cyl disp hp drat wt qsec vs am gear carb 
Mazda RX4   21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 
Mazda RX4 Wag  21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 
Datsun 710  22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
Valiant   18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 

Lassen Sie uns jetzt jede Spalte sortieren:

> mtcars[] <- lapply(mtcars, sort) 

Was sieht die Ausgabe wie:

> head(mtcars, 5) 
        mpg cyl disp hp drat wt qsec vs am gear carb 
Mazda RX4   10.4 4 71.1 52 2.76 1.513 14.50 0 0 3 1 
Mazda RX4 Wag  10.4 4 75.7 62 2.76 1.615 14.60 0 0 3 1 
Datsun 710  13.3 4 78.7 65 2.93 1.835 15.41 0 0 3 1 
Hornet 4 Drive 14.3 4 79.0 66 3.00 1.935 15.50 0 0 3 1 
Hornet Sportabout 14.7 4 95.1 66 3.07 2.140 15.84 0 0 3 1 

Sie sehen auch, dass die rownames nicht mehr informativ sind. Bitte stellen Sie sicher, dass dies das ist, was Sie wollen. Um die kleinsten 500 Zeilen Ihres neuen Datenrahmens zum Speichern zu erhalten, verwenden Sie einfach eine reguläre Teilmenge, z. B. df[1:500,].

die Namen zu halten, können wir eine Liste von Datenrahmen statt generieren:

newdat <- lapply(mtcars, function(x){ 
    dat <- data.frame(ind = rownames(mtcars), out = x) 
    dat <- dat[order(dat$out),] 
}) 

Hier wird die Ausgabe eine Liste mit den alten rownames und der geordneten Spalte namens out (ind genannt). Es ist eine benannte Liste, wobei jedes Listenelement dem Namen der ursprünglichen Spalte entspricht. Beachten Sie, dass Sie die Struktur list weiter verwenden können, z. B. in lapply(newdat, head).

+0

Ich möchte den Zeilennamen ändern, wenn jede Spalte sortiert ist, würde ich auch anwenden innerhalb einer for-Schleife dann? Die erste Spalte ist eine Ladung von Variablen und jede andere Spalte repräsentiert einen anderen Sektor. Für jeden Sektor versuche ich, die Variablen zu ordnen und die Top-Variablen zu speichern, so dass ich danach eine weitere Schleife schreiben werde, um jeden Sektor zu zeichnen. hoffe das macht Sinn –

+0

@OliPaul rownames als neue Spalte hinzufügen, dann sortieren. 'mtcars $ myNames <- rownames (mtcars)', dann sortiere. – zx8754

+0

Sie sind bereits, aber beim Sortieren in der Schleife sind die Namen keine Werte und ich würde sie nicht sortiert haben wollen. –