Ich habe einen 58-Spalten-Datenrahmen, ich muss die Transformation $ log (x_ {i, j} +1) $ auf alle Werte in den ersten 56 Spalten anwenden. Mit welcher Methode könnte ich am effizientesten verfahren? Ich nehme an, dass es etwas gibt, das mir erlauben würde, dies zu tun, anstatt nur einige for-Schleifen zu verwenden, um den gesamten Datenrahmen zu durchlaufen.Funktion auf jeden Wert in einem R-Datenrahmen anwenden
Antwort
sollten Sie in der Lage sein, nur auf die Spalten beziehen Sie wollen, und die Operation tun, das heißt:
df.log[,1:56] <- log(df[,1:56]+1)
alexwhan Antwort für log richtig ist (und wahrscheinlich auch als die richtige Antwort ausgewählt werden sollte). Es funktioniert jedoch so sauber, weil das Protokoll vektorisiert wird. Ich habe den besonderen Schmerz von nicht vektorisierten Funktionen zu oft erlebt. Als ich mit R angefangen habe und die App-Familie nicht gut verstanden habe, habe ich sehr oft auf hässliche Loops zurückgegriffen. Für diejenigen, die auf diese Frage stoßen könnten, die keine vektorisierten Funktionen haben, gebe ich den folgenden Beweis des Konzepts.
#Creating sample data
df <- as.data.frame(matrix(runif(56 * 56), 56, 56))
#Writing an ugly non-vectorized function
logplusone <- function(x) {log(x[1] + 1)}
#example code that achieves the desired result, despite the lack of a vectorized function
df[, 1:56] <- as.data.frame(lapply(df[, 1:56], FUN = function(x) {sapply(x, FUN = logplusone)}))
#Proof that the results are the same using both methods...
#Note: I used all.equal rather than all so that the values are tested using machine tolerance for mathematical equivalence. This is probably a non-issue for the current example, but might be relevant with some other testing functions.
#should evaluate to true
all.equal(log(df[, 1:56] + 1),as.data.frame(lapply(df[, 1:56], FUN = function(x) {sapply(x, FUN = logplusone)})))
Beachten Sie, dass, obwohl es nicht für Ihre speziellen Beispiel funktionieren würde - können Sie rund um eine Funktion erhalten Manchmal wird es nicht vektorisiert, indem man es durch die Funktion "Vectorize" führt. – Dason
Obwohl es funktionieren würde, wenn Sie es doppelt vektorisiert, z. Vektorisieren (Vectorize (logplusone, "x"), "x") – russellpierce
... jedoch finde ich die Vectorized-Funktionen ein wenig auf der schwer zu lesenden Seite, deshalb bevorzuge ich die in meiner Antwort dargestellte Lösung, einfach weil es einfacher ist Ich (wenn ich zurück zum Code gehe) um herauszufinden, wie es funktioniert. – russellpierce
- 1. Anwenden von Tabellenwertfunktion auf jeden Wert einer Spalte in Quelltabelle
- 2. Anwenden Funktion auf einem Wert von Markupextension in XAML zurück
- 3. Python - Sortiere jeden Wert in einem Wörterbuch
- 4. Kreuz anwenden eine Tabelle Wert Funktion
- 5. Anwenden von PHP-Funktion auf bestimmte Schlüssel in einem Array
- 6. Anwenden durch Funktion auf lm()
- 7. Eine Funktion auf Werte in dict anwenden
- 8. wo ist fmap (oder wie man ein Fn auf jeden Wert einer Karte anwenden)
- 9. Funktion auf pandas groupby anwenden
- 10. Funktion auf mehrere Verzeichnisse anwenden
- 11. Wie Funktion auf mehrere Pandas Dataframe anwenden
- 12. Funktion auf Pandas Datenrahmen anwenden
- 13. Funktion auf jede Zelle in Excel anwenden
- 14. Medianfilter auf Pixel mit einem bestimmten Wert anwenden?
- 15. Anwenden einer mathematischen Funktion auf eine andere mathematische Funktion
- 16. Anwenden einer Liste von Funktionen auf einen Wert in Ramda
- 17. Ausgeben jeden Wert in Array
- 18. Anwenden von ng-Klasse basierend auf Wert
- 19. Funktion auf Spalte vor dem Filtern anwenden
- 20. Funktion auf maskiertes numpy Array anwenden
- 21. R Anwenden() - Funktion auf bestimmten Datenframe-Spalten
- 22. Anwenden sqrt Funktion auf einer Säule
- 23. Einen Dekorator auf eine importierte Funktion anwenden?
- 24. Anwenden einer Funktion alle Werte in einem Array
- 25. strptime Funktion Anwenden Serie
- 26. Anwenden Funktion Datenrahmen Spalte
- 27. Python-dict.get-Methode eine Funktion auf einen Schlüssel anwenden
- 28. Anwenden Funktion bedingt
- 29. Anwenden einer Funktion auf beide Seiten einer Gleichheit in Coq?
- 30. PHP jeden Array-Wert in einem String und zeigen den gefundenen Wert
oder 'df [1: 56] <- log (df [1: 56] 1)' –