2017-12-25 22 views
1

Ich habe mydf Datenrahmen unten. Ich möchte jede Zelle, die durch Komma getrennte Daten enthält, in Zeilen aufteilen. Ich suche nach einem Datenrahmen ähnlich y unten. Wie könnte ich es in wenigen Schritten effizient machen? Zur Zeit verwende ich cSplit Funktion auf einer Spalte zu einer Zeit.R separate Komma getrennte Zellen in Zeilen und kartesischen Produkt

Ich versuchte cSplit(mydf, c("name","new"), ",", direction = "long"), aber die didn `t Arbeit

library(splitstackshape) 
mydf=data.frame(name = c("AB,BW","x,y,z"), AB = c('A','B'), new=c("1,2,3","4,5,6,7")) 
mydf 

x=cSplit(mydf, c("name"), ",", direction = "long") 
x 
y=cSplit(x, c("new"), ",", direction = "long") 
y 

Antwort

2

Es gibt Zeiten, in denen eine for Schleife völlig in Ordnung ist mit in R. zu arbeiten. Versuchen:

library(splitstackshape) 
cols <- c("name", "new") 
for (i in cols) { 
    mydf <- cSplit(mydf, i, ",", "long") 
} 

mydf 
##  name AB new 
## 1: AB A 1 
## 2: AB A 2 
## 3: AB A 3 
## 4: BW A 1 
## 5: BW A 2 
## 6: BW A 3 
## 7: x B 4 
## 8: x B 5 
## 9: x B 6 
## 10: x B 7 
## 11: y B 4 
## 12: y B 5 
## 13: y B 6 
## 14: y B 7 
## 15: z B 4 
## 16: z B 5 
## 17: z B 6 
## 18: z B 7 

Hier ist ein kleiner Test etwas größer Daten:

# concat.test = sample data from "splitstackshape" 
test <- do.call(rbind, replicate(5000, concat.test, FALSE)) 

fun1 <- function() { 
    cols <- c("Likes", "Siblings") 
    for (i in cols) { 
    test <- cSplit(test, i, ",", "long") 
    } 
    test 
} 

fun2 <- function() { 
    test %>% 
    separate_rows("Likes") %>% 
    separate_rows("Siblings") 
} 

system.time(fun1()) 
# user system elapsed 
# 3.205 0.056 3.261 
system.time(fun2()) 
# user system elapsed 
# 11.598 0.066 11.662 
1

Wir können die separate_rows Funktion aus dem Paket verwenden.

library(tidyr) 

mydf2 <- mydf %>% 
    separate_rows("name") %>% 
    separate_rows("new") 
mydf2 

# AB name new 
# 1 A AB 1 
# 2 A AB 2 
# 3 A AB 3 
# 4 A BW 1 
# 5 A BW 2 
# 6 A BW 3 
# 7 B x 4 
# 8 B x 5 
# 9 B x 6 
# 10 B x 7 
# 11 B y 4 
# 12 B y 5 
# 13 B y 6 
# 14 B y 7 
# 15 B z 4 
# 16 B z 5 
# 17 B z 6 
# 18 B z 7 

Wenn Sie was nicht separate_rows Funktion mehr als einmal verwenden, können wir eine Funktion entwerfen weiter iterativ die separate_rows Funktion anzuwenden.

Die expand_fun benötigt zwei Argumente. Das erste Argument, df, ist der ursprüngliche Datenrahmen. Das zweite Argument, vars, ist eine Zeichenfolge mit den Spaltennamen, die wir erweitern möchten. Hier ist ein Beispiel, das die Funktion verwendet. Dies ist eine jener Zeiten

mydf3 <- expand_fun(mydf, vars = c("name", "new")) 
mydf3 
# AB name new 
# 1 A AB 1 
# 2 A AB 2 
# 3 A AB 3 
# 4 A BW 1 
# 5 A BW 2 
# 6 A BW 3 
# 7 B x 4 
# 8 B x 5 
# 9 B x 6 
# 10 B x 7 
# 11 B y 4 
# 12 B y 5 
# 13 B y 6 
# 14 B y 7 
# 15 B z 4 
# 16 B z 5 
# 17 B z 6 
# 18 B z 7 
Verwandte Themen