N 개의 동일한 그룹으로 데이터 분할


11

4 열의 값을 포함하는 데이터 프레임이 있습니다.

예를 들면 : ID, price, click count,rating

내가하고 싶은 것은이 데이터 프레임을 N 개의 다른 그룹으로 "분할"하는 것입니다. 각 그룹은 동일한 가격, 클릭 수 및 등급 속성 분포를 가진 동일한 수의 행을 갖습니다.

이 문제를 해결하는 방법에 대한 약간의 아이디어가 없으므로 조언을 부탁드립니다!


원본의 분리 된 하위 집합 인 N 개의 개별 데이터 프레임을 만들려고합니까? 가격, 클릭 수 및 평점의 "동일 분포"는 무엇을 의미합니까?
Alex A.

예, 원본 데이터 프레임의 하위 집합을 찾으십시오. 두 번째 질문에서 1 ~ 10의 방문수 값이 있고 3 개의 다른 하위 집합을 만들기로 결정했기 때문에 각 그룹에서 1 ~ 4 개의 방문수 버킷에서 일부 행, 4 ~ 7 개의 방문수 버킷 및 7-10 회의 방문수 버킷을 포함하며 이는 모든 속성 (가격, 클릭 수 및 평점)과 관련하여 충족되어야합니다. 동일한 속성 확률로 데이터를 다른 그룹으로 샘플링하는 것과 같습니다. 도움이 되었기를 바랍니다.


질문은 변수의 분포를 유지하는 분할을 요청합니다. 추가 정보가 없으면이 문제에 접근 할 올바른 방법을 결정할 수 없습니다. 이것을 CV.com으로 마이그레이션하기 위해 투표
DWin

한계 분포 또는 공동 분포 만 보존 하시겠습니까?
kjetil b halvorsen

답변:


12

질문을 올바르게 이해하면 원하는 것을 얻을 수 있습니다. 데이터 프레임이 호출 df되었고 N정의 했다고 가정하면 다음을 수행 할 수 있습니다.

split(df, sample(1:N, nrow(df), replace=T))

그러면 각 데이터 프레임이에서 임의로 선택된 행으로 구성된 데이터 프레임 목록이 반환됩니다 df. 기본적 sample()으로 각 그룹에 동일한 확률이 할당됩니다.


6

이것은 매우 늦은 답변이지만, 언급 된 문제가 어디서나 논의되었는지 여부를 인터넷 검색 하면서이 페이지를 찾았습니다. 누군가가 지금부터이 페이지를 찾으면 내 대답이 도움이 될 것입니다.

나는 R 패키지를 작성했다.이 패키지는 질문에 대한 것과 정확히 일치 data.frame합니다. 하나 또는 여러 기준에서 그룹 간의 차이를 최소화하려고 시도하면서 N 개의 다른 그룹을 만듭니다. 반복 된 무작위 할당을 기반으로하는 간단한 방법을 사용하며 이는 승인 된 응답에서 제안 된 방법이기도합니다.

이것은 minDiff 패키지에 대한 링크입니다 .

명시된 문제를 해결하기 위해 다음을 사용할 수 있습니다.

library(minDiff)
assigment <- create_groups(dataframe, criteria_scale = c("price", "click count", "rating"), sets_n = N, repetitions = 1000)

repetitions인수는 무작위로 다른 그룹을 생성하는 빈도를 결정합니다. 그룹간에 최소한의 차이가있는 최상의 할당이 반환됩니다.


5

Alex A의 대답은 각 그룹에 대해 동일한 확률을 제공하지만 그룹이 동일한 수의 행을 갖도록하는 질문의 요청을 충족하지 않습니다. R에서 :

stopifnot(nrow(df) %% N == 0)
df    <- df[order(runif(nrow(df))), ]
bins  <- rep(1:N, nrow(df) / N)
split(df, bins)

3
허용되는 답변의 결함에 대한 귀하의 관찰은 좋은 것입니다. 그러나 귀하의 답변은 여전히 ​​관심있는 질문의 일부를 다루지 않으며 (그리고 여기서 닫히지 않은 유일한 이유입니다) : 각 그룹에서 "가격, 클릭 수 및 등급 속성의 동일한 분포"를 달성하는 방법 ?
whuber

@whuber 여기서 답변을 제안 할 수 있습니까?
Léo Léopold Hertz 준영

대답은 "동일한 분포"가 무엇을 의미하는지에 달려 있어야합니다. 이 질문에 요구하고 나타납니다 클러스터 각 클러스터가 관찰 같은 수를 갖는 네 개의 변수에 따라 관찰. 이것을하는 무수한 방법이 있습니다.
whuber

0

tidyr / dplyr을 사용하여 중첩하면 해결할 수 있습니다.

require(dplyr) 
require(tidyr)

num_groups = 10

iris %>% 
   group_by((row_number()-1) %/% (n()/num_groups)) %>%
   nest %>% pull(data)
```
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.