2016-11-02 3 views
1

J'ai un ensemble de données comme les suivantes:recodage à partir du tableau de code distinct

dat1 <- read.table(header=TRUE, text=" 
        ID Age Align Weat 
        8645 15-24 A 1 
        6228 15-24 B 1 
        5830 15-24 A 3 
        1844 25-34 B 1 
        4461 35-44 B 2 
        2119 35-44 C 2 
        2115 45-54 A 1 
        ") 
dat1 
    ID Age Align Weat 
1 8645 15-24  A 1 
2 6228 15-24  B 1 
3 5830 15-24  A 3 
4 1844 25-34  B 1 
5 4461 35-44  B 2 
6 2119 35-44  C 2 
7 2115 45-54  A 1 

Les attributs des colonnes Age, Align et Weat sont décrites dans un code dataframe:

dat2 <- read.table(header=TRUE, text=" 
        Code Desc Column 
        15-24 Young Age 
        25-34 Young Age 
        35-44 Middle Age 
        45-54 Middle Age 
        A Straight Align 
        B Curve Align 
        C Hill Align 
        1 Clear Weat 
        2 Cloudy Weat 
        3 Rain Weat 
        ") 
dat2 
    Code  Desc Column 
1 15-24 Young Age 
2 25-34 Young Age 
3 35-44 Middle Age 
4 45-54 Middle Age 
5  A Straight Align 
6  B Curve Align 
7  C  Hill Align 
8  1 Clear Weat 
9  2 Cloudy Weat 
10  3  Rain Weat 

Je veux pour correspondre à l'image de code pour obtenir mon ensemble de données comme suit:

ID Age Align Weat 
1 8645 Young Straight Clear 
2 6228 Young Curve Clear 
3 5830 Young Straight Rain 
4 1844 Young Curve Clear 
5 4461 Middle Curve Cloudy 
6 2119 Middle  Hill Cloudy 
7 2115 Middle Straight Clear 

J'utilise actuellement les codes suivants pour effectuer ma tâche, ce qui n'est pas efficace pour un grand ensemble de données avec 500 colonnes et une table de code pour ces colonnes.

age <- subset(dat2, Column=="Age") 
age 
    Code Desc Column 
1 15-24 Young Age 
2 25-34 Young Age 
3 35-44 Middle Age 
4 45-54 Middle Age 

align <- subset(dat2, Column=="Align") 
align 
    Code  Desc Column 
5 A Straight Align 
6 B Curve Align 
7 C  Hill Align 

weat <- subset(dat2, Column=="Weat") 
weat 
    Code Desc Column 
8  1 Clear Weat 
9  2 Cloudy Weat 
10 3 Rain Weat 

dat1$Age <- age$Desc[match(dat1$Age, age$Code)] 
dat1$Align <- align$Desc[match(dat1$Align, align$Code)] 
dat1$Weat <- weat$Desc[match(dat1$Weat, weat$Code)] 

dat1 
    ID Age Align Weat 
1 8645 Young Straight Clear 
2 6228 Young Curve Clear 
3 5830 Young Straight Rain 
4 1844 Young Curve Clear 
5 4461 Middle Curve Cloudy 
6 2119 Middle  Hill Cloudy 
7 2115 Middle Straight Clear 
+0

plyr :: fondu pointeront où vous voulez être –

+0

wait .. pourrait être reshape2 pas plyr –

Répondre

1

Vous pouvez utiliser la boucle for sur vos variables dat1:

# 'intersect' is needed to recode only those columns which have description 
for (each_column in intersect(colnames(dat1), dat2$Column)){ 
    curr_dict = dat2$Column %in% each_column 
    code = dat2$Code[curr_dict] 
    descr = dat2$Desc[curr_dict] 
    dat1[[each_column]] = descr[match(dat1[[each_column]], code)] 
} 
1

Essayez une simple boucle:

varnames <- unique(dat2$Column) 
dat3 <- dat1 
for (i in varnames) 
{ startvars <- names(dat3)[!names(dat3) %in% i] 
    dat3 <- merge(dat3, subset(dat2, Column==i), 
         by.x=i, by.y="Code")[,c(startvars, "Desc")] 
    colnames(dat3)[names(dat3) %in% "Desc"] <- i 
} 

Résultat:

ID Age Align Weat 
1 8645 Young Straight Clear 
2 2115 Middle Straight Clear 
3 6228 Young Curve Clear 
4 1844 Young Curve Clear 
5 4461 Middle Curve Cloudy 
6 2119 Middle  Hill Cloudy 
7 5830 Young Straight Rain 

Ceci est évidemment pas super efficace, une solution data.table avec certains dcast pourrait être dans l'ordre, mais je laisserai cela aux autres pour réfléchir.

PS: a dû reformater le 1er jeu de données un peu en ajoutant stringsAsFactors= F, colClasses= rep("character",4)) au read.table