2 Stimmen

Einfache Arithmetik zwischen Spalten mit teilweise übereinstimmenden Namen innerhalb des gleichen Datenrahmens in R.

Ich habe ein großes Datenrahmen, in dem bestimmte Spaltennamen teilweise übereinstimmen, wie unten gezeigt

>daten
   K55.NSC.     H55.NSC.  K55.TLC.     H55.TLC.
1  27520.09     306.6525  284686.6 8.623333e+00  ... ...
2  57455.33  415244.7340  284693.4 1.319481e+04  ... ...
3  85977.20  814413.8720  284700.1 2.560542e+04  ... ...
4 149511.56 1629331.9228  284713.4 5.103493e+04  ... ...
5 285171.80 3213409.0205  284739.7 1.042913e+05  ... ...
6 510536.16 6233470.3062  284790.7 1.957055e+05  ... ...

Ich möchte x.NSC von x.TLC subtrahieren und eine neue Spalte als x.LLC mit den Ergebnissen erstellen, wobei x auf den teilweise übereinstimmenden Spaltennamen verweist. Ein Weg dies zu tun ist, separate Datenrahmen mit 'grep' zu erstellen:

a <- daten[,grep('K55', colnames(daten))]
daten$k55.LLC <- a[1]-a[2]
... ...

Aber dies ist zeitaufwendig und ich finde es schwierig, eine Schleife für diesen Fall zu konfigurieren. Gibt es einen einfachen Weg, das Problem innerhalb des Datenrahmens zu behandeln, ohne eine Liste zu erstellen? Ich habe ein ähnliches Problem hier gefunden, obwohl ich mir nicht sicher bin, ob eine der bereitgestellten Lösungen in meinem Fall anwendbar ist!

3voto

josliber Punkte 42850

Eine Möglichkeit wäre es, alle Präfixe aus den Spaltennamen von data mit strsplit zu erhalten und dann sapply zu verwenden, um die subtrahierten Werte für jede zu generieren:

(n <- unique(sapply(strsplit(colnames(data), "\\."), "[", 1)))
# [1] "K55" "H55"
sapply(n, function(x) data[,paste0(x, ".TLC.")] - data[,paste0(x, ".NSC.")])
#            K55           H55
# [1,]  257166.5     -298.0292
# [2,]  227238.1  -402049.9240
# [3,]  198722.9  -788808.4520
# [4,]  135201.8 -1578296.9928
# [5,]    -432.1 -3109117.7205
# [6,] -225745.5 -6037764.8062

Wenn data Spaltennamen hat, die nicht mit .TLC. oder .NSC. enden, könnten Sie diese Spaltennamen mit etwas wie folgt filtern:

(cols <- grep("(\\.TLC\\.$)|(\\.NSC\\.$)", colnames(data), value=TRUE))
# [1] "K55.NSC." "H55.NSC." "K55.TLC." "H55.TLC."

Dann könnten Sie cols anstelle von colnames(data) im obigen ersten Abschnitt verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X