2017-12-15 24 views
2

왼쪽 열에 값이 있고 오른쪽 열에 해당 값의 빈도가있는 두 열 데이터 프레임이 있습니다. 이 데이터를 하나의 열만있는 새로운 데이터 프레임에 반영하고 싶습니다.rbind 루프를 더 빠르게 만들기

아래의 2 for 루프와 함께 작동하지만 내 데이터 (100k + 행 및 많은 데이터 프레임)가 매우 느립니다. 나는 적용 함수를 사용하여 시도했지만 그것을 밖으로 작동하지 못할 수 있습니다. data.table

library(tidyverse) 

twocol <- tribble(
    ~value, ~count, 
    0.23076923, 5, 
    0.69076923, 3, 
    1.15230769, 4, 
    1.61384615, 4, 
    2.15230769, 3 
) %>% as.data.frame() 

make_onecol <- function(df) { 
    dfnew <- data.frame(value=NA) 
    df %>% filter(count!=0) -> df 
    for (i in 1:nrow(df)) { 
    n <- df[i, 2] 
    for (j in 1:n) { 
     dfnew <- rbind(dfnew, df[i, 1]) 
    } 
    } 
    return(dfnew) 
} 

onecol <- make_onecol(twocol) 
+3

내가 말을하지 않지만, 각 '값''count' 시간을 반복하는 당신의 목표는 다음과 같습니다

onecol <- data.frame(value = c(NA, rep(twocol$value, twocol$count))) 

준다? 그런 다음 간단히'rep (twocol $ value, twocol $ count)'를 수행 할 수 있습니다. – Roland

답변

1

rep 래퍼 :

library(data.table) 
setDT(twocol)[, .(value = rep(value, count))] 
#  value 
# 0.2307692 
# 0.2307692 
# 0.2307692 
# 0.2307692 
# 0.2307692 
# 0.6907692 
# 0.6907692 
# 0.6907692 
# 1.1523077 
# 1.1523077 
# 1.1523077 
# 1.1523077 
# ... 
+0

이전 솔루션 인'data.frame (value = with (two_col, rep (value, count)))'가'data.table' 150000 행을 생성 할 때. 더 많은 수의 행을 검사하지 않았습니다. – Kushdesh

3

당신은 단지에 대한 rep α- 함수를 사용할 수 있습니다. 사용 : tidyverse

> onecol 
     value 
1   NA 
2 0.2307692 
3 0.2307692 
4 0.2307692 
5 0.2307692 
6 0.2307692 
7 0.6907692 
8 0.6907692 
9 0.6907692 
10 1.1523077 
11 1.1523077 
12 1.1523077 
13 1.1523077 
14 1.6138462 
15 1.6138462 
16 1.6138462 
17 1.6138462 
18 2.1523077 
19 2.1523077 
20 2.1523077 
+0

완벽한 감사합니다! 나는 아무것도를 위해 많은 문제에 갔다! :) – jimbo