2015-09-20 52 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()'是一个辅助函数 –

相关问题