2017-12-18 1 views
0

Mit einem Datenrahmen zuweisen Ich möchte einen berechneten Wert auf einer gegebenen SpaltenindexWie Wert einer Spalte auf der Basis eines Spaltenindex

df <- data.frame(a = c(2,4,7,3,5,3), b = c(8,3,8,2,6,1)) 

> df 
    a b 
1 2 8  
2 4 3 
3 7 8 
4 3 2 
5 5 6 
6 3 1 

max <- apply(df, 1, which.max) 
> max 
[1] 2 1 2 1 2 1 

addition <- apply(df, 1, sum) 
> addition 
[1] 10 7 15 5 11 4 

Dann einige Operation basierend zuweisen, die ich nicht heraus kann mit dem folgenden Ergebnis zugewiesen werden df2

> df2 
    a b 
1 2 10 
2 7 3 
3 7 15 
4 5 2 
5 5 11 
6 4 1 

hoch schätzen Sie Ihre Ideen und Ihre Hilfe. Danke

Antwort

0

Sie können auch ifelse direkt vektorisiert verwenden:

with(df, cbind.data.frame(a = ifelse(a > b, a + b, a), b = ifelse(a > b, b, a + b))); 
# a b 
#1 2 10 
#2 7 3 
#3 7 15 
#4 5 2 
#5 5 11 
#6 4 1 
+0

Danke! Das funktioniert. Wenn ich versuchte, "ifelse" Aussagen zu vermeiden, da ich die Positionen habe, fühle ich mich eleganter. Aber nichtsdestotrotz funktioniert das auch, und ich denke, es ist für einen Leser klarer. –

+0

@JeanPaul Keine Sorgen, froh zu helfen. Denken Sie daran, dass "ifelse" vektorisiert ist. Daher wäre es interessant, einen Benchmark-Vergleich mit der "cbind" -Methode durchzuführen, um zu sehen, welche Methode schneller ist. –

2

Sie cbind verwenden können Sie Ihre ausgewählten Spalten für jede Zeile zuzugreifen:

df2 = df 
df2[cbind(1:nrow(df2),max)] = addition 
df2 
    a b 
1 2 10 
2 7 3 
3 7 15 
4 5 2 
5 5 11 
6 4 1 

Hier cbind liefert eine Matrix von 2 Spalten und 6 Zeilen, die wir verwenden, um den Datenrahmen unter Verwendung von Matrix subsetting der Teilmenge.

+1

Sie können es tun, ohne die 'apply' Anrufe mit' max.col' und 'rowSums':' df [cbind (seq (nrow (df)), max.col (df))] <- rowSums (df) ' – alistaire

+0

Vielen Dank! Ich vermisse die 'cbind()' auf der linken Seite. Ich habe 'df [, max] <- addition' versucht. Könnte freundlich erklären, warum dies einen Fehler verursacht, aber einschließlich des 'cbind' und des Zeilenindex, der von' seq' erzeugt wird, funktioniert? –

+0

Wenn Sie zum Beispiel 'df [, c (2,1,2,1,2,1)]' verwenden, wählen Sie zum Beispiel die gesamte zweite Spalte, 1. Spalte, 2. Spalte, 1. Spalte usw., was zu einem Datenrahmen mit 6 Spalten und 6 führt Reihen. Aus diesem Grund erhalten Sie einen Fehler, wenn Sie versuchen, den Additionsvektor zuzuordnen. Hier gibt 'cbind()' eine Matrix zurück, mit der wir den Datenrahmen unterteilen. – Lamia

Verwandte Themen