2017-01-19 1 views
-1

2 백만 개가 넘는 레코드가 포함 된 데이터 프레임이 있습니다. 데이터 보안상의 이유로 일부 레코드 만 공유하고 있습니다. 귀하가 내 이유를 이해할 수 있기를 바랍니다.for 루프 내부의 코드 속도 향상

data <- data[order(data$email_address_hash),] 
skip_row <- c() 
data$hash_time <- rep('NA',NROW(data)) #adding new column to our data 
rownames(data) <- as.character(1:NROW(data)) 
dput(droplevels(data)) 
structure(list(email_address_hash = structure(c(2L, 1L, 1L, 2L 
), .Label = c("0004eca7b8bed22aaf4b320ad602505fe9fa9d26", "35c0ef2c2a804b44564fd4278a01ed25afd887f8" 
), class = "factor"), open_time = structure(c(2L, 1L, 3L, 4L), .Label = c(" 04:39:24", 
" 09:57:20", " 10:39:43", " 19:00:09"), class = "factor")), .Names = c("email_address_hash", 
"open_time"), row.names = c(41107L, 47808L, 3973L, 8307L), class = "data.frame") 

str(data) 
'data.frame': 4 obs. of 2 variables: 
$ email_address_hash: Factor w/ 36231 levels "00012aec4ca3fa6f2f96cf97fc2a3440eacad30e",..: 7632 2 2 7632 
$ open_time   : Factor w/ 34495 levels " 00:00:03"," 00:00:07",..: 15918 5096 16971 24707 
. 

skip_row <- c() 


data$hash_time <- rep('NA',NROW(data)) #adding new column to our data 

rownames(data) <- as.character(1:NROW(data)) 

for(i in 1:NROW(data)){ 
#Skipping the email_address_hash that was already used for grouping 
    if(i %in% skip_row) next 
    hash_row_no <- c() 
#trimming data so that we don't need to look into whole dataframe 


trimmed_data <- data[i:NROW(data),] 
    # Whenever we search for email_address_hash the previous one was ignored or removed from the check 

    #extracting rownames so that we can used that as rownumber inside the skip_row 
    hash_row_no <- rownames(trimmed_data[trimmed_data$email_address_hash==trimmed_data$email_address_hash[1],]) 

#note : - 우리는/B rownames와 ROWNUMBER w 차이를 알고

#converting rownames into numeric so that we can use them as rowno  
hash_row_no <- as.numeric(hash_row_no) 


    first_no <- hash_row_no[1] 
    last_no <- hash_row_no[NROW(hash_row_no)] 
    skip_row <- append(skip_row,hash_row_no) 

    data$hash_time[first_no] <- paste(data$open_time[first_no:last_no], collapse = "") 
} 

나는 또한 아래 시도 과정을 빠르게하기 위해 접근하지만 그 효과가 될 것으로 보인다 있습니다

hash_row_no <- rownames(trimmed_data[trimmed_data$email_address_hash==trimmed_data$email_address_hash[1],]) 

setDT(data) 
,369을 data.table하는 dataframe 변환

는 작업 중 하나가 시간

system.time(rownames(trimmed_data[trimmed_data$email_address_hash==trimmed_data$email_address_hash[1],])) 

system.time(rownames(trimmed_data)[trimmed_data[["email_address_hash"]] == trimmed_data$email_address_hash[1]]) 

너희들이 내 데이터는 2 개 이상의 백만 레코드를 포함하고 30 분 더 복용으로 내 코드를 가속화하는 데 도움이 유사 시간을 제공 수행?

+0

그런 다음 실제 목표를 설명해야합니다. 더 나은 알고리즘은 더 나은 성능을 얻을 수 있습니다. – Roland

+0

데이터 보안 측면에서이 점을 언급했습니다. . 목표는 한 사람의 모든 영업 시간을 추출하여 해당 고객 앞에 그리고 여러 행 대신 단일 행으로 작성하고 해당 고객의 다른 항목을 삭제하는 것입니다. – user110244

+0

이는 여전히 필요한 것에 대한 적절한 설명이 아닙니다. 끝내라. 지금까지 나는 각 고유 한'email_address_hash'에 대한 모든 open_time 값을'붙여 넣기 '를 원한다는 것을 이해했습니다. 그게 올바른 문제 설명입니까? – Roland

답변

1

은 분명히 당신은이 작업을 수행 할 수 :

library(data.table) 
setDT(data) 
data[, .(open_times = paste(open_time, collapse = "")), by = email_address_hash] 
#       email_address_hash   open_times 
#1: 35c0ef2c2a804b44564fd4278a01ed25afd887f8 09:57:20 19:00:09 
#2: 0004eca7b8bed22aaf4b320ad602505fe9fa9d26 04:39:24 10:39:43 

또는 가능성이 : ". 나는 너희들이 내 이유를 이해할 수 소원"

data[email_address_hash == "0004eca7b8bed22aaf4b320ad602505fe9fa9d26", 
    paste(open_time, collapse = "")] 
#[1] " 04:39:24 10:39:43" 
+0

한 가지 문제가 있습니다. 보기 (데이터)를 사용하여 열면 첫 번째 열린 시간 만 표시됩니다. 즉 행 1의 경우 09:57:20이고 두 번째 행의 동일한 고객의 경우 두 번째입니다. 우리의 경우보기가 4 행으로 표시됩니다 – user110244

+0

더 명확하게 의사 소통을 시도하십시오. 나는 내 대답의 코드가 결과를 할당하지 않았기 때문에 당신이'View'로 무엇을 열고 있는지 전혀 모른다. – Roland

+0

대단히 감사합니다. – user110244