的前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)
時,它沒有對數據幀做任何改變,我不明白爲什麼。
謝謝!
真棒。我需要了解更多關於apply函數的信息。 (dum [2:4],2,function(x){ifelse(x> = quantile(x,.8),1,0)}也許你應該在綁定前應用一個後綴。 ) colnames(傻瓜)< - paste(colnames(傻瓜),「dummy」,sep =「_」) dum2 = cbind(dum,dummies)' – pyll
謝謝,你的代碼比我的優雅得多,但它並沒有解決我得到的問題比我應該得到的更多。我得到不同數量的1。你有什麼想法,爲什麼這可能是? – seeellayewhy
@pyll好點。在使用這個事實後,我做了它:'colnames(out)[5:7] < - paste0(colnames(dum)[2:4],「_dummy」)' – seeellayewhy