如何在对另一列进行检查时更改列中的值?

时间:2015-09-20 04:38:27

标签: r for-loop row

以下是我的数据示例:

     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循环做到这一点,所以我想出了:

    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值吗?我希望我提出的问题有道理,谢谢。

1 个答案:

答案 0 :(得分:2)

如果您想修复循环,请尝试将x计数器更改为数字向量(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 ...将其强制转换为1和0。

as.integer

<强> data.table

随着您的数据集越来越大,您可能希望在工作流程中加入# 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

<强>加成

而不是library(data.table) setDT(dat)[, A_pred01 := as.integer(dat$A_pred > 0.5)] 尝试较短的as.integer(dat$A_pred > 0.5)