2017-12-25 29 views
1

아래 데이터 프레임은 mydf입니다. 쉼표로 구분 된 데이터가 들어있는 셀을 분할하여 행에 넣고 싶습니다. 아래의 y과 비슷한 데이터 프레임을 찾고 있습니다. 몇 단계에서 어떻게 효율적으로 처리 할 수 ​​있습니까? 현재 나는 한 번에 한 열에 cSplit 기능을 사용하고 있습니다. R 쉼표로 구분 된 셀을 행과 직교로 분리합니다.

나는 cSplit(mydf, c("name","new"), ",", direction = "long")을 시도하지만 돌아가신`t 작업

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 

답변

2

은 시간이 있습니다. 시도 :

# 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 
: 여기

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 
약간 더 큰 데이터를 사용하여 작은 테스트입니다
1

우리는 패키지에서 separate_rows 기능을 사용할 수 있습니다.

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 

당신이 한 번 이상 separate_rows 기능을 더 무엇을 사용하지 않을 경우, 우리는 더 반복적으로 separate_rows 기능을 적용하는 기능을 디자인 할 수 있습니다.

expand_fun <- function(df, vars){ 
    while (length(vars) > 0){ 
    df <- df %>% separate_rows(vars[1]) 
    vars <- vars[-1] 
    } 
    return(df) 
} 

expand_fun은 두 가지 인수를 취합니다. 첫 번째 인수 인 df은 원래 데이터 프레임입니다. 두 번째 인수 인 vars은 확장하려는 열 이름이있는 문자열입니다. 다음은이 함수를 사용하는 예제입니다. for 루프 이것은 그 시간 중 하나입니다 R.에서 함께 일할 완전히 잘 때

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