2016-05-31 4 views
0

Wenn ich die folgende data.frame konvertieren möchten:Wie umgekehrte Aggregatbefehl auf einem Datenframe?

>M 
    name ID 
    a  1 
    b,c  2 
    d,e  3 
    f  4 

auf diese:

>M 
name ID 
a  1 
b  2 
c  2 
d  3 
e  3 
f  4 

Wie kann ich tun, um diese Umwandlung für alle Elemente der ersten Spalte?

Dank

+2

[ein] (http://stackoverflow.com/questions/29758504/split-data-frame-row-into-multiple -rows-basiert-auf-Kommas), [zwei] (http://stackoverflow.com/questions/37492809/add-new-line-in-df-using-grep-or-regex), [drei] (http : //stackoverflow.com/questions/30525811/how-to-separate-comma-separated-values-in-r-in-a-new-row), [vier] (http://stackoverflow.com/questions/33113263/splitting-a-single-column-in-multiple-observation-using-r), [fünf] (http://stackoverflow.com/questions/33571978/split-value-from-a-data- Frame-and-create-zusätzliche-row-to-store-its-Komponente) – rawr

Antwort

1

Hier ist eine Lösung Basis R:

# split the names into a list 
nameList <- strsplit(df$name, split=",") 
# get your new data.frame 
newdf <- data.frame(names=unlist(nameList), ID=rep(df$ID, sapply(nameList, length))) 

Dies verwendet rep die ID die gleiche Anzahl von Malen zu wiederholen den Namen Variable wurde geteilt. Dies bedeutet, dass es funktioniert, wenn Sie 3 oder mehr Namen haben.

Daten

df <- read.table(header=T, text="name ID 
    a  1 
    b,c  2 
    d,e  3 
    f  4", stringsAsFactors=F) 

Ausgang

> newdf 
    names ID 
1  a 1 
2  b 2 
3  c 2 
4  d 3 
5  e 3 
6  f 4 
2

Sie können unnest() von tidyr verwenden:

library(dplyr); library(tidyr) 
mutate(M, name = strsplit(name, ",")) %>% unnest(name) 
Source: local data frame [6 x 2] 

    ID name 
    (chr) (chr) 
1  1  a 
2  2  b 
3  2  c 
4  3  d 
5  3  e 
6  4  f 
Verwandte Themen