2016-11-02 2 views
1

У меня есть набор данных, как следующее:перекодирования из отдельной таблицы кодов

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 

Атрибуты столбцов Age, Align и Weat описаны в кодовом 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 

Я хочу для соответствия коду dataframe, чтобы получить мой набор данных, например:

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 

В настоящее время я использую следующие коды для выполнения своей задачи, что неэффективно для большого набора данных с 500 столбцами и таблицей кодов для этих столбцов.

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 :: расплав укажут вам, где вы хотите быть –

+0

wait .. может быть reshape2 not plyr –

ответ

1

Вы можете использовать for петлю на ваших переменных в 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

Попробуйте простой цикл:

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 
} 

Результат:

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 

Это, очевидно, не супер-эффективным, data.table решение с некоторым dcast может быть в порядке, но я оставлю это, чтобы другие обдумали.

PS: пришлось переформатировать 1-й DataSet немного, добавляя stringsAsFactors= F, colClasses= rep("character",4)) к read.table

Смежные вопросы