2016-05-03 4 views
2

Ich habe einen Datenrahmen in R, der 3 Spalten hat: IDs (die möglicherweise und wahrscheinlich wiederholt werden), Codes und Beschreibungen. Ich muss ein Codesegment erstellen, das unter Verwendung dieses Datenrahmens einen Datenrahmen mit der gleichen Anzahl von Zeilen zurückgibt, in dem jede Zeile eine ID, einen Code und alle Beschreibungen in der ursprünglichen DF (entweder in verschiedenen Spalten oder eine einzelne Spalte mit eingefügtem Text, beide sind in Ordnung);IDs eines Datenrahmens in R erhalten und Text aus der Beschreibungsspalte in alle Zeilen mit übereinstimmenden IDs einfügen

So zum Beispiel, ich folgenden Datenrahmen df habe:

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 

Und ich wünschte, etwas ähnliches zu erhalten: doesn

 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 

Wie bereits erwähnt, der passende Text aus anderen Reihen muss nicht in der Spalte 'descriptiontest' sein, das Hinzufügen von Spalten ist in Ordnung.

Können Sie mir helfen?

Antwort

1

Dies ist eine schnelle und schmutzige Art, es zu tun. Ich bin mir sicher, dass jemand anderes mit einer einfachen Einlinienmethode kommen wird. :)

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) 

Dadurch werden die Datensätze von IDstest als Nebenwirkung:

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 
Verwandte Themen