루프를 사용하여 R의 행 합계를 가져 오지 마십시오. 여기서 각 행에 대해 서로 다른 열의 합계를 시작하고 중지합니다.

user3150172

나는 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 분 정도 걸립니다. 누구든지 이것을 수행하는 더 빠른 방법에 대한 제안이 있습니까?

BrodieG

모든 동일한 유형의 값을 처리하는 경우 일반적으로 행렬에서 작업을 수행합니다. 다음은 매트릭스 형태의 솔루션입니다.

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관