2017-06-01 41 views
0

的前x%,如果換上假的觀察我有一個大的數據幀的一些數據(約80x300),看起來是這樣的:的R - 在VAR

dum <- data.frame(id=c("a", "b", "c", "d", "e"), 
       v1=c(2, 7, 8, 5, 0), 
       v2=c(9, 2, 4, 6, 1), 
       v3=c(2, 2, 6, 1, 7)) 

我想談談每個變量成一個二分變量,表示每個特定觀察值是否在每個變量的前20%。 {稍後我將合併虛擬數據集和原始數據集,這對於現在來說並不重要,但如果任何人想要獲得創意,那就是完整的計劃。}現在輸出數據框應該看起來像這樣:

id  v1  v2  v3 
a  0  1  0 
b  0  0  0 
c  1  0  0 
d  0  0  0 
e  0  0  1 

我在此嘗試如下所示:

top <- 20 # set percentage 
for(i in 2:ncol(dum)) { 
    for(j in 1:nrow(dum)) { 
    ifelse(dum[j,i]>=unname(quantile(dum[,i],probs=((100-top)/100))), dum[j,i]<-1, dum[j,i]<-0) 
    } 
} 

然而,當我運行此命令我最終得到更多的人比在某些情況下,期望在輸出數據集中和準確的數量我想在其他情況下。它看起來像這樣:

id  v1  v2  v3 
a  0  1  0 
b  0  0  0 
c  1  0  0 
d  1  1  0 
e  0  1  1 

任何人都可以幫助確定我要去哪裏錯了嗎?一些注意事項:1)我準備好討厭使用循環,尤其是嵌套循環,但這是我熟悉的事情,計算時間在這裏不是問題。 2)基於我的谷歌搜索似乎使用應用系列的功能可能是有用的,但我不是很熟悉它們,所以我不知道從哪裏開始。 3)我包括unname()命令作爲嘗試修復,但運行相同或不運行。 4)ifelse()聲明的YES/NO部分對我來說很有趣,但是當我試圖做ifelse(cond, 1, 0)時,它沒有對數據幀做任何改變,我不明白爲什麼。

謝謝!

回答

3

您可以使用applyifelse來執行此操作。請看下圖:

apply(dum[2:4],2,function(x) {ifelse(x>=quantile(x,.8),1,0)}) 

這將返回:

 v1 v2 v3 
[1,] 0 1 0 
[2,] 0 0 0 
[3,] 1 0 0 
[4,] 0 0 0 
[5,] 0 0 1 

請注意,我用dum[2:4]識別相關欄目進行條件測試。使用完整數據集時,應該修改此選項,以僅選擇所需的相關列。

如果要合併與原來的數據,你可以添加:

dum2 = cbind(dum,apply(dum[2:4],2,function(x) {ifelse(x>=quantile(x,.8),1,0)})) 

將返回:

id v1 v2 v3 v1 v2 v3 
1 a 2 9 2 0 1 0 
2 b 7 2 2 0 0 0 
3 c 8 4 6 1 0 0 
4 d 5 6 1 0 0 0 
5 e 0 1 7 0 0 1 
+2

真棒。我需要了解更多關於apply函數的信息。 (dum [2:4],2,function(x){ifelse(x> = quantile(x,.8),1,0)}也許你應該在綁定前應用一個後綴。 ) colnames(傻瓜)< - paste(colnames(傻瓜),「dummy」,sep =「_」) dum2 = cbind(dum,dummies)' – pyll

+0

謝謝,你的代碼比我的優雅得多,但它並沒有解決我得到的問題比我應該得到的更多。我得到不同數量的1。你有什麼想法,爲什麼這可能是? – seeellayewhy

+0

@pyll好點。在使用這個事實後,我做了它:'colnames(out)[5:7] < - paste0(colnames(dum)[2:4],「_dummy」)' – seeellayewhy