2015-09-20 108 views
0

這裏是我的數據的例子:如何更改列中的值,同時檢查列中的值?

 essay ns0_nns1 A_pred B_pred A_pred01 B_pred01 
1  1  1 0.558 0.370  NA  NA 
2  2  0 0.293 0.654  NA  NA 
3  3  0 0.545 0.849  NA  NA 
4  4  0 0.432 0.698  NA  NA 
5  5  1 0.651 0.404  NA  NA 
6  6  0 0.657 0.502  NA  NA 
7  7  1 0.884 0.658  NA  NA 
8  8  1 0.736 0.348  NA  NA 
9  9  0 0.532 0.791  NA  NA 
10 10  0 0.180 0.789  NA  NA 

我需要去通過,如果A_pred是< = 0.5,則在A_pred01相應的行應該分配0,否則應分配1

我以爲我可以用一個循環做到這一點,所以我就來了:

for(i in dat$A_pred){ 
     if(i<=0.5){ 
      dat$A_pred01[i]=0 
     } else { 
      dat$A_pred01[i]=1} 
    } 

這並沒有工作,雖然。我想我需要知道的是,我可以以某種方式爲A_pred01佔用一個與i對應的佔位符,並且它會在for循環中更改每個A_pred01值?我希望我所問的是有道理的,謝謝。

回答

2

如果您想修復循環,請嘗試將i計數器更改爲數字向量(1 2 3 4 5 ...)而不是列的值。您的原始代碼無效,因爲i的值是.558。所以當你運行dat$A_pred01[i]時,你在那裏輸入了小數。所以它跑dat$A_pred01[0.558]這不是你所期望的。

for(i in 1:nrow(dat)){ 
    if(dat$A_pred[i]<=0.5){ 
     dat$A_pred01[i]=0 
    } else { 
     dat$A_pred01[i]=1} 
} 

矢量化

您還可以避免環路共用:

dat$A_pred01 <- as.integer(dat$A_pred > 0.5) 

表達dat$A_pred > 0.5是指示邏輯向量如果每個元件滿足條件(TRUE FALSE FALSE ...)。然後我們用as.integer將它強制爲1和0。

# essay ns0_nns1 A_pred B_pred A_pred01 B_pred01 
# 1  1  1 0.558 0.370  1  NA 
# 2  2  0 0.293 0.654  0  NA 
# 3  3  0 0.545 0.849  1  NA 
# 4  4  0 0.432 0.698  0  NA 
# 5  5  1 0.651 0.404  1  NA 
# 6  6  0 0.657 0.502  1  NA 
# 7  7  1 0.884 0.658  1  NA 
# 8  8  1 0.736 0.348  1  NA 
# 9  9  0 0.532 0.791  1  NA 
# 10 10  0 0.180 0.789  0  NA 

data.table

隨着數據集變得越來越大,你可能要包括data.table到您的工作流程。下面是與語法相同的操作:

library(data.table) 
setDT(dat)[, A_pred01 := as.integer(dat$A_pred > 0.5)] 

獎金

代替as.integer(dat$A_pred > 0.5)嘗試短+(dat$A_pred > 0.5)

+0

這工作,謝謝!但是,你能幫我理解「1:nrow(dat)」是怎麼回事嗎?再次感謝。 –

+0

'nrow(dat)'是'dat'中的總行數。試試吧'1:nrow(dat)'會產生類似'1 2 3 4 5 6 ..'的東西。我們也可以做'1:length(A_pred)'或'1:length(essay)'。這是因爲數據幀的所有列具有相同的長度。如果您不熟悉運算符':',那麼'seq()'是一個輔助函數 –