2016-05-03 4 views
2

У меня есть кадр данных в R, который имеет 3 столбца: идентификаторы (которые могут и, вероятно, повторяться), коды и описания. Мне нужно создать сегмент кода, который с использованием этого фрейма данных возвращает фрейм данных с тем же числом строк, в котором каждая строка имеет один идентификатор, один код и все описания, связанные с этим идентификатором в исходном DF (либо в разных столбцы или один столбец со вставленным текстом, оба являются точными);Получение идентификатора кадра данных в R и вставка текста из столбца описания во все строки с соответствующими идентификаторами

Так, например, у меня есть следующий кадр данных ДФ:

IDstest <- c(1:5,5:1,3,4,1) 
codestest <- c("X1","Z1","C1","X1","X2","J9","A","Y1","Z2","C5","A","P2","Z") 
descriptiontest <- c("Desc 1","Desc 2","Test","Just typing randomly","Desc 4","Desc 5","Desc 1","Random","Desc ZZZ","Desc 1","YYY","XYZ","Desc 4","Test") 

df <- data.frame(IDstest, codestest, descriptiontest) 
df 

    IDstest codestest  descriptiontest 
1  1  X1    Desc 1 
2  2  Z1    Desc 2 
3  3  C1     Test 
4  4  X1 Just typing randomly 
5  5  X2    Desc 4 
6  5  J9    Desc 5 
7  4   A    Desc 1 
8  3  Y1    Random 
9  2  Z2    Desc ZZZ 
10  1  C5    Desc 1 
11  3   A     YYY 
12  4  P2     XYZ 
13  1   Z    Desc 4 

И я хотел бы получить что-то подобное:

 IDstest codestest     descriptiontest 
1  1  X1   Desc 1; Desc 1; Desc 4 
2  2  Z1     Desc 2; Desc ZZZ 
3  3  C1     Test; Random; YYY 
4  4  X1 Just typing randomly; Desc 1; XYZ 
5  5  X2     Desc 4; Desc 5 
6  5  J9     Desc 5; Desc 4 
7  4   A Desc 1;Just typing randomly; XYZ 
8  3  Y1     Random; Test; YYY 
9  2  Z2     Desc ZZZ; Desc 2 
10  1  C5   Desc 1; Desc 1; Desc 4 
11  3   A     YYY; Test; Random 
12  4  P2 XYZ; Just typing randomly; Desc 1 
13  1   Z   Desc 4; Desc 1; Desc 1 

Как уже упоминалось, согласование текста из других строк Безразлично «Должен быть в столбце« descriptiontest », добавление столбцов в порядке.

Вы можете мне помочь?

ответ

1

Это быстрый и грязный способ сделать это. Я уверен, что кто-то еще придет вместе с одноразовым методом. :)

IDstest <- c(1:5,5:1,3,4,1) 
codestest <- c("X1","Z1","C1","X1","X2","J9","A","Y1","Z2","C5","A","P2","Z") 
descriptiontest <- c("Desc 1","Desc 2","Test","Just typing randomly","Desc 4","Desc 5","Desc 1","Random","Desc ZZZ","Desc 1","YYY","XYZ","Desc 4") 

df <- data.frame(IDstest, codestest, descriptiontest) 

uniqueIDs <- unique(df[,"IDstest"]) 
mergedescription <- rep("", length(uniqueIDs)) 
for(i in uniqueIDs) { 
    mergedescription[i] <- paste(df[IDstest == i, "descriptiontest"], collapse = "; ") 
} 

mdf <- data.frame(IDstest = uniqueIDs, mergedescription) 

final.df <- merge(df, mdf) 

Это сортирует записи по IDstest как побочный эффект:

IDstest codestest  descriptiontest     mergedescription 
1  1  X1    Desc 1   Desc 1; Desc 1; Desc 4 
2  1  C5    Desc 1   Desc 1; Desc 1; Desc 4 
3  1   Z    Desc 4   Desc 1; Desc 1; Desc 4 
4  2  Z1    Desc 2     Desc 2; Desc ZZZ 
5  2  Z2    Desc ZZZ     Desc 2; Desc ZZZ 
6  3  C1     Test     Test; Random; YYY 
7  3  Y1    Random     Test; Random; YYY 
8  3   A     YYY     Test; Random; YYY 
9  4  X1 Just typing randomly Just typing randomly; Desc 1; XYZ 
10  4   A    Desc 1 Just typing randomly; Desc 1; XYZ 
11  4  P2     XYZ Just typing randomly; Desc 1; XYZ 
12  5  J9    Desc 5     Desc 4; Desc 5 
13  5  X2    Desc 4     Desc 4; Desc 5