2017-10-11 4 views
-1

Der Versuch, diesen Datenrahmen in eine Verhältnismatrix zu konvertieren, so dass für Januar 2007 Spalte A, wäre es gleich Jan 2007/Durchschnitt des Jahres 2007, für Februar 2007 wäre es gleich 4/Durchschnitt des Jahres 2007 ... muss in allen Spalten angewendet werden.Verhältnis Monat zu Jahresdurchschnitt

YearM A B C 
2007/Jan 3 5 7 
2007/Feb 4 5 6 
2007/Mar 4 4 2 
........... 
2013/Dec 4 4 2 
+0

Können Sie 'dput' verwenden, um ein Beispiel Ihrer Daten zu veröffentlichen? die Probe, die Sie jetzt eingefügt haben, ist sehr schwierig zu arbeiten mit – bouncyball

+0

gerade herausgefunden, wie man dput verwenden. – jkl

+0

Vergessen Sie nicht, die Antwort zu akzeptieren, die Ihnen am hilfreichsten ist, indem Sie auf das graue Häkchen unter der Schaltfläche – useR

Antwort

2
library(dplyr) 

avg_mat = df %>% 
    group_by(year = sub("/.*", "", YearM)) %>% 
    mutate_at(vars(A:C), "mean") %>% 
    ungroup() %>% 
    select(A:C) %>% 
    as.matrix() 

mat = df %>% 
    select(A:C) %>% 
    as.matrix() 

cbind(YearM = df$YearM, as.data.frame(mat/avg_mat)) 

Ergebnis:

 YearM   A   B C 
1 2007/Jan 0.8181818 1.0714286 1.4 
2 2007/Feb 1.0909091 1.0714286 1.2 
3 2007/Mar 1.0909091 0.8571429 0.4 
4 2013/Dec 1.0000000 1.0000000 1.0 

Daten:

df = read.table(text = "YearM A B C 
2007/Jan 3 5 7 
2007/Feb 4 5 6 
2007/Mar 4 4 2 
2013/Dec 4 4 2", header = TRUE) 
+0

klicken, danke! Gibt es irgendeine Möglichkeit, die Daten/den Monat zurück zur Ausgabematrix hinzuzufügen? – jkl

+0

@jkl Sicher, siehe meine Updates. Um das 'YearM' hinzuzufügen, müssen Sie die Matrix in data.frame umwandeln, sonst wird es zu numeric gezwungen. – useR

0

Hier ist ein weiterer Weg, um die sapply und ave Funktionen. Der ave Teil ist von this post geliehen.

df$year <- year = sub("/.*", "", df$YearM)  
df[,c('A','B','C')] <- df[,c('A','B','C')]/sapply(df[,c('A','B','C')], ave, df$year) 


    YearM   A   B C year 
1 2007/Jan 0.8181818 1.0714286 1.4 2007 
2 2007/Feb 1.0909091 1.0714286 1.2 2007 
3 2007/Mar 1.0909091 0.8571429 0.4 2007 
4 2013/Dec 1.0000000 1.0000000 1.0 2013