2017-06-21 12 views
0

I mit Datenrahmen arbeitete und ich brauche Daten zu extrahieren, wie folgt:Auszugswerte für eine Spalte aus einer anderen Spalte auf einer andere Spalte in Datenrahmen R basierten

I den folgenden Datenrahmen habe.

a = c(1:40) 
b = c(41:80) 
c = c(81:120) 
d = c('a','b','c','d','e') 
e = NA 
f = NA 
g = NA 
df = cbind.data.frame(a,b,c,d,e,f,g) 
names(df) = c('1m','2m','3m','reg','1m_comp','2m_comp','3m_comp') 


1m 2m 3m reg 1m_comp 2 m_comp 3m_comp 
1 41 81 a  NA  NA  NA 
2 42 82 b  NA  NA  NA 
3 43 83 c  NA  NA  NA 
4 44 84 d  NA  NA  NA 
5 45 85 e  NA  NA  NA 
6 46 86 a  NA  NA  NA 

I in Funktion die ‚comp‘ Spalten mit den Werten aus dem ‚1m‘, ‚2 m‘ Spalten zu füllen, wenn ‚reg‘ Spalte einen bestimmten Wert hat.

ich dies tun:

df = within(df, { 
1m[reg=='a'] <- 1m_comp[reg=='a'] 
2m[reg=='a'] <- 2m_comp[reg=='a'] 
3m[reg=='a'] <- 3m_comp[reg=='a']}) 

Die Datenrahmen, die an dem ich arbeite hat 46 + 46 solcher Säulen (die Spalten und die Comps). Anstatt 46 Zeilen Code zu schreiben, habe ich versucht

Allerdings sehe ich keine Änderung in meinem Datenrahmen. Ich sehe auch keinen Fehler.

Edit: Gelöst jetzt! Danke d.b.

+1

'df [df $ reg == "a", 5: 7] = df [df $ reg == "a", 1: 3]' –

+0

Ist es möglich, dies mit dem Spaltennamen zu tun anstelle der Spaltennummer? – NiRa

+1

'df [df $ reg ==" a ", c (" 1m_comp "," 2m_comp "," 3m_comp ")] = df [df $ reg ==" a ", c (" 1m "," 2m ", "3m")] ' –

Antwort

1

Wenn Sie nicht alle Spaltennamen fest codieren möchten, können Sie so etwas verwenden.

comp.cols <- colnames(df)[grepl("_comp", colnames(df)) == TRUE] 
non.comp.cols <- sub("_comp", "", comp.cols) 

df[df[,"reg"] == "a", comp.cols] <- df[df[,"reg"] == "a", non.comp.cols] 
Verwandte Themen