2017-10-23 3 views
0

Problem: Ich habe eine Reihe von Datenrahmen mit numerischen Spalten mit unterschiedlichen Spaltennamen. Die Spalten befinden sich jedes Mal an derselben Position. Der df MatA hat die Spalten iBAQ.MatA.01 bis 30, wenn der Datenrahmen YoungA die Spalten iBAQ.YoungA.01 bis 30 hat. Ich möchte Spalte 11 durch Spalte 8 teilen. Sie sind immer in der gleichen Position, also MatA[9] entspricht YoungA[9].So teilen Sie zwei Spalten mit Pipes und. (Punkt) Referenzen

Ich verwende dplyr, um eine Reihe von Befehlen zu leiten, und wäre glücklich, wenn ich nicht viele Zeilen mit aktualisierten Variablennamen manuell bearbeiten müsste. Deshalb möchte ich . verwenden, um den ursprünglichen Datenrahmen zu referenzieren. Dies führt jedoch zu einer falschen Ausgabe, wo viele identischen Spalten erstellt werden, wie in dem unten stehenden minimal Beispiel:

> library(dplyr) 
> Data <- data.frame(
    X = sample(1:10), 
    Y = sample(1:10) 
) 


> Data2 <- Data %>% 
    mutate(ratio = X/Y) 

> Data3 <- Data %>% 
    mutate(ratio = Data$X/Data$Y) 

> Data2, Data3 
    X Y  ratio 
1 8 1 8.0000000 
2 1 6 0.1666667 
3 5 10 0.5000000 
4 3 8 0.3750000 
5 2 3 0.6666667 
6 10 4 2.5000000 
7 6 9 0.6666667 
8 7 5 1.4000000 
9 9 7 1.2857143 
10 4 2 2.0000000 

Der Ausgang ist das, was ich will, aber dieser Ansatz erforderlich manuelle Anpassung der einzelnen Variablennamen für jeder neue Datenrahmen.

Probieren Sie andere Art zu teilen, aber referenzieren die Spalte nach Position, nicht ID funktioniert nur, wenn nicht in einer mutate Funktion verwendet.

> Data[1]/Data[2] 

      X 
1 8.0000000 
2 0.1666667 
3 0.5000000 
4 0.3750000 
5 0.6666667 
6 2.5000000 
7 0.6666667 
8 1.4000000 
9 1.2857143 
10 2.0000000 

> Data4 <- Data %>% 
    mutate(ratio = Data[1]/Data[2]) 

> Data5 <- Data %>% 
    mutate(ratio = .[1]/. [2]) 

> Data4, Data5 
    X Y ratio. ratio. ratio. ratio. ratio. ratio. ratio. ratio. ratio. ratio. 
1 8 1 8.0000000 8.0000000 8.0000000 8.0000000 8.0000000 8.0000000 8.0000000 8.0000000 8.0000000 8.0000000 
2 1 6 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 
3 5 10 0.5000000 0.5000000 0.5000000 0.5000000 0.5000000 0.5000000 0.5000000 0.5000000 0.5000000 0.5000000 
4 3 8 0.3750000 0.3750000 0.3750000 0.3750000 0.3750000 0.3750000 0.3750000 0.3750000 0.3750000 0.3750000 
5 2 3 0.6666667 0.6666667 0.6666667 0.6666667 0.6666667 0.6666667 0.6666667 0.6666667 0.6666667 0.6666667 
6 10 4 2.5000000 2.5000000 2.5000000 2.5000000 2.5000000 2.5000000 2.5000000 2.5000000 2.5000000 2.5000000 
7 6 9 0.6666667 0.6666667 0.6666667 0.6666667 0.6666667 0.6666667 0.6666667 0.6666667 0.6666667 0.6666667 
8 7 5 1.4000000 1.4000000 1.4000000 1.4000000 1.4000000 1.4000000 1.4000000 1.4000000 1.4000000 1.4000000 
9 9 7 1.2857143 1.2857143 1.2857143 1.2857143 1.2857143 1.2857143 1.2857143 1.2857143 1.2857143 1.2857143 
10 4 2 2.0000000 2.0000000 2.0000000 2.0000000 2.0000000 2.0000000 2.0000000 2.0000000 2.0000000 2.0000000 

Mein Ziel ist es mit einer Nomenklatur wie für Daten5 zu beenden, da dies die leicht angepasst für verschiedene Datenrahmen mit identischem Layout aber anderen Variable und Datenrahmen Namen. Ich wäre auch glücklich über jede Idee, wie man diese einfache Unterteilung anders ausdrückt, damit sie nicht bricht.

Vielen Dank!

Antwort

0

Ich fand heraus, dass dies funktioniert:

Data6 <- Data %>% 
    mutate(ratio = .[,1]/.[,2]) 

Offenbar eine Spalte außerhalb eines verrohrt Argument funktioniert anders als innen verweisen.

Ich lösche das nicht als Referenz für andere.

+0

Sie sollten dieses Kapitel auf [Subsetting in R] (http://adv-r.had.co.nz/Subsetting.html) lesen. Die einzelne Klammer gibt einen einspaltigen Datenrahmen zurück, daher der Auswertungsfehler bei der Verwendung von Pipes. Wenn Ihnen die zusätzlichen Kommas in Ihrer Problemumgehung nicht gefallen, können Sie stattdessen immer doppelte Klammern verwenden, um auf Spalten zuzugreifen: 'Data%>% muate (Ratio =. [[1]] /. [[2]])' –

+0

Vielen Dank Sie, das ist sehr wertvolle Eingabe. – Joram

Verwandte Themen