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 분 더 복용으로 내 코드를 가속화하는 데 도움이 유사 시간을 제공 수행?
그런 다음 실제 목표를 설명해야합니다. 더 나은 알고리즘은 더 나은 성능을 얻을 수 있습니다. – Roland
데이터 보안 측면에서이 점을 언급했습니다. . 목표는 한 사람의 모든 영업 시간을 추출하여 해당 고객 앞에 그리고 여러 행 대신 단일 행으로 작성하고 해당 고객의 다른 항목을 삭제하는 것입니다. – user110244
이는 여전히 필요한 것에 대한 적절한 설명이 아닙니다. 끝내라. 지금까지 나는 각 고유 한'email_address_hash'에 대한 모든 open_time 값을'붙여 넣기 '를 원한다는 것을 이해했습니다. 그게 올바른 문제 설명입니까? – Roland