0

* 업데이트 나는 53 개의보기 중에서 그다지 듣지 못했습니다. 나의 독창적 인 생각은 이것이 상당히 공통적 인 필요가 있어야한다는 것이었다. 어느 쪽이든 의견을 보내 주시면 감사하겠습니다.
1) 수정중인 테이블을 참조하는 테이블의 성격
2) 이유가 더 흔하지 않거나 다른 통찰력이있는 이유
3) if my 게시는 어떤 방식 으로든 명확성이나 혼란이 없습니다.
모든 방향에 대해 감사드립니다.
최종 업데이트 *R - 인라인/벡터 구문을 사용하여 중첩 된 자체 참조 조건부 집계 할당

나는 "중첩 된 자체 참조 집계 과제"이 아닌이 기타를 호출 것을 너무 확실하지 않다.

  1. 두 번째 부분은 처리되는 행의 조건에 의해 정의되는 부분 집합의 하위 집합을 처리합니다.
  2. 데이터 테이블 KEYS로 첫 번째 하위 집합을 차단할 수 있습니다 (방금 처리 속도를 높일 수 있음)
  3. 하위 하위 집합의 열 합계를 찾고 있습니다.
  4. 처리중인 행을 기반으로하는 조건이 있습니다.
  5. 정말 -이 고려 될 수있는 3 개 계층
    • 상위 데이터 프레임/테이블
    • 블록 (제 1 서브 세트)
    • 조건부 동적 집합
  6. 단순화 예 (?) 데이터의 보일 수 있습니다와 같은 :
set_num respd_num opt_num   r6 r_rank   g1 
     1  10002  1 -0.2105112116  1 -0.8382152438 
     1  10002  2 -0.0390887667  7 0.0140819481 
     1  10002  3 0.0657098525  10 0.0657098525 
     1  10002  4 -0.0515756431  6 -0.0374936950 
     1  10002  5 -0.2010318437  2 -0.6277040322 
     1  10002  6 -0.1320728396  4 -0.2512542469 
     1  10002  7 -0.1754179416  3 -0.4266721885 
     1  10002  9 -0.0192308747  8 0.0531707148 
     1  10002  10 -0.0816877122  5 -0.1191814073 
     1  10002  11 0.0066917370  9 0.0724015895 

이 항목 집합의 항목에 대해 sum(r6)과 동일한 값인 g1을 계산 (할당)하려고합니다. r_rank> = 처리중인 행의 항목입니다.

속도는이 코드를 사용하는 함수가 OPTIM에 의해 호출되므로 중요합니다.

다음은 sqldf 코드입니다. 나는 data.table .SD로 일을 시도하고 랭킹 파트에서 작업하기 위해 갔다. 그리고 끝내기에는 너무 느렸다. 나는 lapply으로 일을 시도했다. 매우 잘 작동하는 순위 계산법입니다. 그러나 나는이 도전에 필요한만큼 그것을 수정할 수 없다.

tbl_all_data <- tbl_all_data[,r_rank:=rank(r6),by=key(tbl_all_data)] 

, 중첩, 자체 참조는 합계 작업은이 기능/모델을 구성하는 많은 조각의 집중적 가장 많은 시간이라고 나를 위해 아마도 가장 도전에있다.

f_new <- sqldf("select *, 
         (select sum(r6) 
         from df t2 
         where 
         t2.set_num = t1.set_num and 
         t2.resp_id = t1.resp_id and 
         t2.r_rank >= t1.r_rank 
        ) as g1      
       from df t1 
       ORDER BY t1.set_num, t1.opt_num") 

매우 빠르고 구현하기 쉽고 (즉, C로 작성하지 않아야 함) 해결책이 필요하며 긍정적 인 방향을 고맙게 생각합니다.

* 업데이트 * 내가 루프에서 처리한다면
, 내가 복제 할 수있는 DF 또는 DT와 ...

i = 3 
for (i in 1:nrow(dt1)) { 
    print(i) 
    dt1[i,test:=dt2[set_num==dt1[i,set_num] & respd_num==dt1[i,respd_num] & r6<dt1[i,r6],sum(r6)]] 
} 

을하지만이 대규모 오랜 시간이 걸립니다.

나는 데이터 테이블 구문을 사용하여 부분적으로 거기에 도착 할 수 있습니다

new_df <- dt1[,sum(r6),by=list(set_num,respd_num)] 

어떻게 R6의 조건을 처리 할 것입니다 - 3의 마지막 조건 : 나는 다음을 시도

합니다. 귀하의 계산을 이해하기

+0

어쩌면 내가보고 있지 않다 페이지에 서식 문제가 있습니다. r6은 값 0.903219719로 시작하는 열입니다. r6이 다른 (의도하지 않은) 표시기의 정수라고 평가하는 경우 알려주십시오. – Dom

+0

죄송합니다. –

답변

0

확실하지 ...

new_df <- dt1[,sum(r6<dt1[,r6]),by=list(set_num,respd_num)] 
new_df <- dt1[r6<dt1[,r6],sum(r6),by=list(set_num,respd_num)]] 

들으 : 그 중 어느 것도 내가 찾고있는 유효한 값을 반환하지만, 당신에게 내가 뭘하려고 오전의 아이디어를 줄 수 있습니다. 나는 첫 번째 그룹에 대해 g1을 올바르게 계산했지만, 마지막 g1이 0.903220 이고 0.94894587이 아닌 이유를 알아낼 수 없습니다.

s <- 'set_num respd_num opt_num r6   r_rank g1 
1  1002  1   0.903219719 1  0.000000 
1  1002  2   0.411544925 4  2.460055 
1  1002  3   0.770223176 3  1.689832 
1  1002  4   0.786611795 2  0.903220 
2  1002  1   0.485307389 3  1.689832 
2  1002  2   0.94894587 1  0.000000 
2  1002  3   0.430522339 4  2.460055 
2  1002  4   0.705036633 2  0.903220' 

library(plyr) 
df <- read.table(text=s, header=TRUE) 

ddply(df, c('set_num', 'respd_num'), function(x) { 
    oo <- order(x$r_rank) 
    g2 <- Reduce(.Primitive("+"), x$r6[oo], init=0, accumulate=TRUE) 
    x$g2 <- g2[order(oo)] 
    x 
    }) 

출력 :

set_num respd_num opt_num  r6 r_rank  g1  g2 
1  1  1002  1 0.9032197  1 0.000000 0.0000000 
2  1  1002  2 0.4115449  4 2.460055 2.4600547 
3  1  1002  3 0.7702232  3 1.689832 1.6898315 
4  1  1002  4 0.7866118  2 0.903220 0.9032197 
5  2  1002  1 0.4853074  3 1.689832 1.6539825 
6  2  1002  2 0.9489459  1 0.000000 0.0000000 
7  2  1002  3 0.4305223  4 2.460055 2.1392899 
8  2  1002  4 0.7050366  2 0.903220 0.9489459 
+0

감사합니다. 칼. 매우 감사. 나는 오늘 밤 이것을보고 시험 할 것이다. – Dom

+0

칼, 내 코드에서 내 g1의 값을 수정하기 위해 일부 디버깅을했습니다. 솔직히 무슨 일이 일어 났는지는 모르지만 sqldf 코드는 훨씬 빠르게 실행됩니다. 나에게는 병목 현상이 여전히 있으며, 속도를 높이기 위해 데이터 표를 사용하는 방법이 있다는 느낌이 들립니다. 다음은 sqldf 코드의 결과입니다. – Dom

+0

코드 붙여 넣기 방법을 아직 배우고 있습니다 ... – Dom