2016-06-22 8 views
0

Wie kann ich die Zeile, die den gleichen Wert für Spalte1 hat, kombinieren und die Zusammenführung von Spalte2 richtig formatieren (siehe Beispiel)?2 ähnliche Zeile in Spalte 1 kombinieren und zweite Spalte Text in r zusammenfügen

Eingang:

> df 
     COL1 COL2 
    1 b21 blabla1 
    2 b21 blabla2 
    3 b55 sdlafk 

Wunsch Ausgang (2 Reihe, weil b21 in 1 Reihe kombiniert):

 COL1 COL2 
    1 b21 blabla1 
      blabla2 
    2 b55 sdlafk 

Quelle

df <- structure(list(COL1 = structure(c(1L, 1L, 2L), .Label = c("b21", 
"b55"), class = "factor"), COL2 = structure(1:3, .Label = c("blabla1", 
"blabla2", "sdlafk"), class = "factor")), .Names = c("COL1", 
"COL2"), class = "data.frame", row.names = c(NA, -3L)) 
+0

Wollen Sie noch ein data.frame? Sollen Werte in 'Col2' zusammengefügt werden oder nur in einer Liste sein, wenn' col1' gleich ist? – Psidom

+0

Jede Lösung ist willkommen – S12000

Antwort

0

Wenn Sie Col2 wollen in gespeichert werden eine Liste:

data.table::setDT(df)[, .(COL2 = list(COL2)), .(COL1)] 
    COL1   COL2 
1: b21 blabla1,blabla2 
2: b55   sdlafk 

Wenn Sie wollen, dass es zu einem Zeichen konvertieren:

data.table::setDT(df)[, .(COL2 = paste(COL2, collapse = ",")), .(COL1)] 
    COL1   COL2 
1: b21 blabla1,blabla2 
2: b55   sdlafk 

können Sie verwenden Basis R auch:

aggregate(COL2 ~ COL1, df, paste, collapse = ",") 
    COL1   COL2 
1 b21 blabla1,blabla2 
2 b55   sdlafk 
0

verschiedene Optionen, je nachdem, was Ihr Ziel ist es (Präsentation gegenüber der Lagerung):

df <- data.frame(COL1 = c("b21", "b21", "b55"), 
        COL2 = c("blabla1", "blabla2", "sdlafk")) 

Einfache Liste:

split(df$COL2, df$COL1) 
# $b21 
# [1] "blabla1" "blabla2" 
# $b55 
# [1] "sdlafk" 

Presentation-only:

within(df, { COL1 = ifelse(duplicated(COL1), "", COL1) }) 
# COL1 COL2 
# 1 b21 blabla1 
# 2  blabla2 
# 3 b55 sdlafk 

dplyr (Ergänzung @ Psidom der data.table):

library(dplyr) 
df %>% 
    group_by(COL1) %>% 
    summarize(COL2 = paste(COL2, collapse = ",")) 
# Source: local data frame [2 x 2] 
# COL1   COL2 
# <chr>   <chr> 
# 1 b21 blabla1,blabla2 
# 2 b55   sdlafk