2017-06-23 5 views
0

Ich glaube nicht, dass dieses spezielle Problem im Forum zuvor aufgetreten ist, aber bitte zeigen Sie mir in die richtige Richtung, wenn es eine doppelte Frage ist!Lang zu weit mit doppelten Zeilennamen

Ich habe den folgenden Datensatz und möchte ihn von lang nach breit umformen.

ID variable     value 
1 number of students   1000 
1 percentage on financial aid 28 
1 acceptance rate    12 
1 percentage on financial aid 35 
2 number of students   2000 
2 percentage on financial aid 1 
2 percentage on financial aid 70 

Beachten Sie, dass der Wert percentage on financial aid zweimal für jede ID erscheint. Ich möchte nur das zweite Vorkommen bei der Umformung von lang nach breit behalten, da das erste Vorkommen der Rang der Schule durch die "Finanzhilfe" -Maßnahme ist, während das zweite Vorkommen der tatsächliche Wert ist.

Der Variablenname percentage on financial aid ist für beide Werte genau gleich, also habe ich mich gefragt, ob es eine Möglichkeit gibt, R das erste Auftreten mit dem zweiten zu überschreiben. Gerade jetzt scheint R das erste Auftreten zu behalten.

+0

Wie Sie sagten, Sie wollen nur für dups den letzten Auftritt nehmen. Warum nicht zuerst filtern? – mt1022

+0

'Erstes Auftreten' Sie meinen zufällig oder? – amonk

+0

Ah, du hast Recht @ mt1022. Ich habe vergessen, dass ich von LAST = TRUE und nur die zweite Instanz behalten kann. Danke vielmals! – gonnastop

Antwort

0
zz = ' 
ID variable     value 
1 number_of_students   1000 
1 percentage_on_financial_aid 28 
1 acceptance_rate    12 
1 percentage_on_financial_aid 35 
2 number_of_students   2000 
2 percentage_on_financial_aid 1 
2 percentage_on_financial_aid 70 
' 

df <- read.table(text = zz, header = TRUE) 


ndf = apply(df, 2, rev) 
ndf = as.data.frame(ndf) 
nd = reshape(ndf, idvar = "ID", timevar = "variable", direction = "wide") 
a = colnames(nd) 
b = sub('.*\\.', '', a) 
colnames(nd) = b 
nd 

    ID percentage_on_financial_aid number_of_students acceptance_rate 
1 2       70    2000   <NA> 
4 1       35    1000    12 

Wenn Sie fromLast = T dann tun:

nd = reshape(df, idvar = "ID", timevar = "variable", direction = "wide") 
a = colnames(nd) 
b = sub('.*\\.', '', a) 
colnames(nd) = b 
nd 
0

Ich dachte, dies sich aus durch die Menschen, die kommentiert.

Lösung:

df <- subset(df,duplicated(df[,1:2])|!duplicated(df[,1:2],fromLast=TRUE))