- 질문 게시판입니다.
Date 22/12/07 17:13:19
Name   소요
Subject   R 코드 효율화
임의화 검정 때문에 데이터가 배열될 수 있는 각 경우의 수에 해당하는 데이터들의 전체 집합을 구하려고 합니다. 완전 랜덤은 아니고 제약 조건이 있어서, 따로 R로 코드를 짜고 있어요.

예를 들어

학생 A가 실험 6, 7
학생 B가 실험 4, 6

에 지원했다고 하면

가능한 조합 1: 6, 4
가능한 조합 2: 6, 6
가능한 조합 3: 7, 4
가능한 조합 4: 7, 6

으로 학생을 실험에 배정하는(학생은 실험 1개에 무조건 참여, 1개 실험에는 여러 학생이 참여 가능) 경우의 모든 조합을 데이터 프레임으로 만드려고 해요.

무식하게 다중 for문을 굴려봤는데

for (a in c(6, 7)){
  for (b in c(4, 5, 6)){
    for (c in c(4, 6)){
      for (d in c(1, 3)){
        [합치는 식]
   }
  }
}
}

for문을 17개를 겹치니 속도가 너무 느립니다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 경우의 수는 44만개 정도 되는데, 2시간 굴려도 13만개에서 허덕이네요.

대개 벡터 계산이 속도가 빠른 편이라 관련 함수 개발된 게 있나 찾아보려고 해도, 위에 다중 for문으로 구현하려고 하는 계산의 명칭을 모르니 검색 자체를 못하고 있네요.

제가 구현하고 싶은 다중 for문의 수학적 명칭 혹은 코드를 효율화 할 수 있을 다른 방법이 있을까요?

이 글 올리고 일단 자러 가야하기 때문에 답변 혹은 감사인사는 몇 시간 뒤에 드릴 수 있을 것 같습니다 ㅠ



0


노루야캐요
코드 자체는 BFS나 DFS를 사용해서 최적화할 수 있을 것 같은데, 결국 경우의 수가 44만개라면 결국 44만번 계산을 해야 하는 건 똑같기 때문에 느린 건 마찬가지일 것 같네요.
2
감사합니다! 이건 또 새로운 영역이네요 https://sg-moomin.tistory.com/entry/BFSDFS-%EA%B9%8A%EC%9D%B4%EC%9A%B0%EC%84%A0%EB%84%88%EB%B9%84%EC%9A%B0%EC%84%A0-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EB%A6%AC-%EC%84%B8%EA%B8%B0%EB%AC%B4%EB%AF%BC

데이터 테이블 만든 이후에 조건에 따라 향후 다시 골라낸다면 그 때 적용해 볼 수 있을 것 같아요. for문 돌려둔 컴 작업 끝나면 BFS/DFS를 한 번 파봐야겠네요~~
라임오렌지나무
R은 for 문이 워낙 느립니다.

1. Rcpp에 boost 라이브러리를 쓰면 속도는 가장 빠르긴 할텐데 이건 무늬만 R이고 C++ 코딩을 하는 거라 어렵지요.

2. 쓸 수 있다면 apply 함수를 쓰는 게 더 빠릅니다.

3. 유사한 문제에서 R way는 44만 개 크기 빈 데이터프레임을 만든 다음에 column by column 으로 원하는 값을 할당하는 방식이긴 합니다. 그런데 주신 설명으론 말씀하시는 문제에 적용 가능한지 잘 모르겠어요 ㅠㅠ
2
감사합니다! fop문 사용 < apply 사용 < 벡터 계산 식으로 속도가 빠르다고 하더라고요. 아래 찾아낸 tidyr 패키지의 crossing()이 어떤 계산에 해당할지는 모르겠지만 일단 도전을,,, https://statkim.github.io/rcpp-tutorial/ Rcpp도 공부를 해야겠네요 8ㅅ8 역시 세상은 넒다...
R은 안 써봤지만 대충 expand.grid() 같은 너낌이 듭니다. 메모리만 충분하면 위 함수로 모든 학생들의 지원 목록에 대한 카테시안 곱을 만들고 constraint로 한번에 필터링 하는 것도…?

요런 느낌인데.. 참고만 하십시오. https://stackoverflow.com/questions/17798363/expand-grid-when-one-variable-is-really-two-columns
2
감사합니다! 찾아보니 개념적으로는 카데시안 곱이 제가 원하는 걸 정확하게 표현하네요. https://statisticsglobe.com/cartesian-product-r 를 참고해서 시도해 볼 수 있을 것 같아요. 다른 컴에 돌려봐야지 희희
1
와 컴퓨팅 파워가 다른 컴이기는 한데, crossing() 쓰니까 10초만에 해결되네요 ㅠㅠㅠㅠㅠ
4
덜커덩
대충 벡터화해서 전치행렬 얻고 tile/repeat 좀 써서 옆으로 컬럼을 붙여나가는 방식으로 직접 n개 배열의 카테시안 곱을 얻는 것도 재미있을 수 있읍니다. (아님)
2
후덜덜 그건 또 다른 레벨의 연습이 될 것 같습니다 ㅋㅋㅋㅋㅋ
벡터는 신이야!
복잡도 공부의 중요성을 다시금 느끼고 갑미다
일반적으로는 스몰 데이터를 다뤄서 효율성은 걱정을 안 하는데, 방법론 연구에 가까운 분야를 해보려다보니 시뮬레이션을 해야 해서 효율성을 따지게 되네요 ㅋㅋㅋ
아~ 완벽히 이해했어! (아님)
여우아빠
고수만 쓴다는 R... 저는 SPSS도 버거워서..
목록
번호 제목 이름 날짜 조회 추천
공지 질문 게시판 이용 규정 11 토비 15/06/19 25573 4
16946 가정/육아보일러실 청소를 위해 청소업체를 이용하고 싶은데 추천해주실 만한 곳이 있으실까요? 눈사람 25/08/18 67 0
16945 기타올해 입사한 신입인데 아직도 계속 혼나면서 적응을 못하는 것 같아요.. 21 + [익명] 25/08/17 756 0
16944 IT/컴퓨터챗 gpt 같은 ai 추천 좀 부탁드립니다. 4 어둠달골짜기 25/08/16 396 0
16943 기타광주광역시 맥줏집 추천 부탁드립니다 4 호미밭의파스꾼 25/08/16 285 0
16942 여행부산 맛집 추천부탁드립니다 4 연구개발 25/08/15 289 0
16941 의료/건강뇌가 짱 쉬는 법 23 골든햄스 25/08/15 836 0
16940 여행제주 중문 근처 아기랑 가기 좋은 음식점 3 Xeri 25/08/15 280 0
16938 여행경남 남해 관광지 추천 부탁드립니다. 15 OshiN 25/08/13 474 0
16937 IT/컴퓨터Office 2021에서 자동저장 켤 수 있나요? 6 루루얍 25/08/13 298 0
16936 의료/건강아이가 틱인지 아닌지 구분이 안갑니다. + 상담 좀 6 2025 25/08/12 596 0
16935 기타중고 냉장고 어디서 구매 하면 좋을까요!? 4 닉넴멀루하지 25/08/11 356 0
16934 IT/컴퓨터모니터 HDMI 케이블을 연결했을 때 노트북 상판에 전기가 흐르는 현상? 1 달씨 25/08/11 282 0
16933 댓글잠금 의료/건강마트롤환은 어떤 약인가요 1 [익명] 25/08/11 450 0
16932 체육/스포츠10월 9일까지 10.9km 뛰는 몸 만들기 어느 정도 난이도일까요 28 kaestro 25/08/10 645 0
16931 기타회사에 대한 개인의 의견제시. 할까요 말까요? 11 연구개발 25/08/10 642 1
16930 IT/컴퓨터폴드7용 차량 거치대 어떤 것이 좋을까요? 6 다군 25/08/10 292 0
16929 가정/육아자취를 시작하려는 아는 동생에게 선물 36 kaestro 25/08/09 785 0
16928 기타자소서 표절률이 1 물리물리 25/08/09 494 0
16927 체육/스포츠스마트워치 추천해 주실 수 있을까요? 12 두부곰 25/08/08 534 0
16926 기타세탁기 구매 질문입니다 2 맥주만땅 25/08/07 302 0
16925 기타공주 9/27 1박 숙소 질문드립니다. 8 Omnic 25/08/07 322 0
16924 IT/컴퓨터랩탑 파우치 추천 3 pils 25/08/07 299 0
16923 의료/건강서울 수면클리닉 관련 질문 2 거소 25/08/07 289 0
16922 IT/컴퓨터초등학생 타블렛 따로 써야 할까요 5 Picard 25/08/06 438 0
목록

+ : 최근 2시간내에 달린 댓글
+ : 최근 4시간내에 달린 댓글

댓글