나는 Stata에서 R을 처음 접했습니다. 100 개 이상의 열과 수천 개의 행이있는 데이터 프레임이 있습니다. 각 행에는 시작 값, 중지 값 및 100 개 이상의 숫자 값 열이 있습니다. 목표는 시작 값에 해당하는 열에서 중지 값에 해당하는 열까지 각 행의 합계를 가져 오는 것입니다. 이것은 다음과 같이 루프에서 수행하기에 충분히 직접적입니다 (data.frame은 df, start는 시작 열, stop은 중지 열).
for(i in 1:nrow(df)) {
df$out[i] <- rowSums(df[i,df$start[i]:df$stop[i]])
}
이것은 훌륭하게 작동하지만 15 분 정도 걸립니다. 누구든지 이것을 수행하는 더 빠른 방법에 대한 제안이 있습니까?
모든 동일한 유형의 값을 처리하는 경우 일반적으로 행렬에서 작업을 수행합니다. 다음은 매트릭스 형태의 솔루션입니다.
rows <- 10^3
cols <- 10^2
start <- sample(1:cols, rows, replace=T)
end <- pmin(cols, start + sample(1:(cols/2), rows, replace=T))
# first 2 cols of matrix are start and end, the rest are
# random data
mx <- matrix(c(start, end, runif(rows * cols)), nrow=rows)
# use `apply` to apply a function to each row, here the
# function sums each row excluding the first two values
# from the value in the start column to the value in the
# end column
apply(mx, 1, function(x) sum(x[-(1:2)][x[[1]]:x[[2]]]))
# df version
df <- as.data.frame(mx)
df$out <- apply(df, 1, function(x) sum(x[-(1:2)][x[[1]]:x[[2]]]))
를 사용하여 data.frame을 행렬로 변환 할 수 있습니다 as.matrix
. 표시된대로 data.frame에서 직접 적용을 실행할 수도 있습니다. 여전히 상당히 빠릅니다. 코드의 실제 문제는 데이터 프레임 nrow
시간을 수정하고 데이터 프레임을 수정하는 것이 매우 느리다는 것입니다. apply를 사용하면 답 ( $out
열) 을 생성하여 문제 를 해결할 수 있습니다. 그런 다음 데이터 프레임에 다시 결합 할 수 있습니다 (즉, 데이터 프레임을 한 번만 수정한다는 의미입니다).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다