2017-01-14 21 views
1

我有一個數據集,我想根據標準將人員分配到不同的組,但是,我希望R自動執行此操作。我已將< = 0.33百分位和> = 67知分數等變量分開。根據變量的33/67%百分位數將人員分配給團隊

dfOCEAN <-df[1:60,1:7] 
print(colnames(dfOCEAN)) 
dfOCEAN <- dfOCEAN[complete.cases(dfOCEAN),] 

i = 0 
    for(i in 1:length(dfOCEAN$factor_e)){ 
    if(dfOCEAN$factor_e[i] <= quantile(dfOCEAN$factor_e, c(.33))){ 
     dfOCEAN$Introversion[i] <- 1 
    } 
    else if(dfOCEAN$factor_e[i] >= quantile(dfOCEAN$factor_e, c(.67))){ 
     dfOCEAN$Introversion[i] <- 2 
    } 
    else 
    dfOCEAN$Introversion[i] <- 3 
    } 

i = 0 
for(i in 1:length(dfOCEAN$factor_c)){ 
    if(dfOCEAN$factor_c[i] <=quantile(dfOCEAN$factor_c, c(.33))){ 
    dfOCEAN$Conscientious[i] <- 1 
    } 
    else if(dfOCEAN$factor_c[i] >= quantile(dfOCEAN$factor_c, c(.67))){ 
    dfOCEAN$Conscientious[i] <- 2 
    } 
    else 
    dfOCEAN$Conscientious[i] <- 3 
} 

然後,我試圖用Dplyr的切片函數創建隨機樣本。

dfOCEANset <- dfOCEAN %>% group_by(c(Introversion, Conscientious)) %>% slice(sample(c(1,2),1)) 

但是,我無法得到想要的結果。理想情況下,我將檢索一個數據幀,由此數據將與不同類別的組合來聚集和姓名將保持

回答

3

嘗試此環路更小(但未經檢驗在不存在可再現的示例的)方法:

dfOCEAN$fac_grp <- c(1,3,2)[ findInterval(dfOCEAN$factor_e, 
          quantile(dfOCEAN$factor_e, c(0, .33, .67)), 
           )} 

R旨在用作「矢量化」語言,findIntervalquantile函數將返回矢量,而findInterval將給出與第一個參數相同長度的矢量。你要求我們以一種相當不自然的方式安排一點點皺紋,我通過使用findInterval的結果作爲三項矢量的索引來處理。另一個做類似(但返回一個因子)的函數是cut函數。

+0

嗨42,令人驚歎的答案,這確實消除了實際循環的需要,但是,查詢的後半部分想要自動創建排名高或低2個因素的人的團隊。你有什麼想法嗎? – Lowpar

+0

我說明了如何用'factor_e'來做到這一點。我不明白這個困難。似乎很明顯怎麼做'factor_c' –

+0

事實上,這部分是成功的,但是現在對於數據框,我想將數據框分成更小的部分,這樣每個更小的數據框代表一個團隊,那些在factro_e和facto_c上排名最高的人被分組在一起,而factro_e和facto_c等分數較低。我想我可以將數據框分組,然後隨機抽取這些數據框來製作更小的團隊。 – Lowpar