以下是我的数据示例:
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值吗?我希望我提出的问题有道理,谢谢。
答案 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)
。