我有一个包含6列的data.frame。第一个是主题,第二个是实验中的块,第3,4和5列是我需要计算二进制分数(0或1)的值,我想在第六列中添加(这就是为什么现在,它充满了0)。
head(kfdblock3to9)
subject time gr ugr sdugr IL
40002.3 40002 3 0.4475618 0.3706000 0.02994533 0
40002.4 40002 4 0.4361786 0.3901111 0.01846110 0
40002.5 40002 5 0.4279880 0.4550000 0.02811839 0
40002.6 40002 6 0.4313647 0.4134444 0.04352974 0
40002.7 40002 7 0.4420889 0.4394286 0.02883143 0
40002.8 40002 8 0.4325227 0.3960000 0.06559222 0
我试图用for循环来做这个,但我是R的初学者,我遇到了这个困难。我试图实现的评分公式是:如果第3列($ gr)中的值小于第4列($ ugr)中的值与第5列中值的.35倍之间的差值($ sdugr) ),然后主题收到1,否则为0。
到目前为止我尝试过的是:
for (i in kfdblock3to9$subject) {
if (kfdblock3to9$gr<(kfdblock3to9$ugr-(.35*kfdblock3to9$sdugr)))
kfdblock3to9$IL=1
else kfdblock3to9$IL=0
}
这给了我50个警告,都说:“条件长度> 1,只使用第一个元素”
我想我当时对索引做错了,但是我还没弄清楚。任何帮助深表感谢。
看看within
和ifelse
:
kfdblock3to9 <-
within(kfdblock3to9,
IL <- ifelse( gr < ugr - 0.35 * dugr, 1, 0)
)
within()
实际上并不是那么必要,但它可以让你的代码更容易阅读和理解。
为什么会出错?那是因为你的病情是矢量化的:试试
kfdblock3to9$gr<(kfdblock3to9$ugr-(.35*kfdblock3to9$sdugr))
你会看到它返回一个逻辑向量。现在,if()
子句一次只能处理一个布尔值。如果你有矢量化结果,你需要一个矢量化解决方案,那就是ifelse()
为了解决你的问题,我建议这样的事情:
kfdblock3to9[, "IL"] <- ifelse(kfdblock3to9$gr < (kfdblock3to9$ugr-(0.35*kfdblock3to9$sdugr)), 1, 0);
(矢量化方法大多比循环快。)
你的循环是错误的,因为你不尊重你的索引i
。你必须使用i
来访问循环中的行:
for (i in seq(along=kfdblock3to9)) {
cat("row:", i, kfdblock3to9[i, "subject"], "\n");
}
你想要的是一个逻辑测试。因此,你可以避免使用loop
,甚至ifelse
,并简单地做:
kfdblock3to9$IL <- with(kfdblock3to9, gr < (ugr-0.35*sdugr))
IL列将包含TRUE为FALSE,而不是1或0.如果您更喜欢使用整数,则可以执行以下操作:
kfdblock3to9$IL <- as.integer(with(kfdblock3to9, gr < (ugr-0.35*sdugr)))
在这种情况下,您不应该使用循环。无论何时将来使用循环,都需要使用索引:
for (i in 1:length(kfdblock3to9$subject)) {
if (kfdblock3to9[i,"gr"] < (kfdblock3to9[i, "ugr"] - .35 * kfdblock3to9[i, "sdugr"]))
kfdblock3to9[i,"IL"]=1
else kfdblock3to9[i,"IL"]=0
}
kfdblock3to9
subject time gr ugr sdugr IL
40002.3 40002 3 0.4475618 0.3706000 0.02994533 0
40002.4 40002 4 0.4361786 0.3901111 0.01846110 0
40002.5 40002 5 0.4279880 0.4550000 0.02811839 1
40002.6 40002 6 0.4313647 0.4134444 0.04352974 0
40002.7 40002 7 0.4420889 0.4394286 0.02883143 0
40002.8 40002 8 0.4325227 0.3960000 0.06559222 0