我有一个包含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列中值(.sdugr)的.35倍之间的差值,则主题接收1,否则为0。
到目前为止我尝试的是:
for (i in kfdblock3to9$subject) {
if (kfdblock3to9$gr<(kfdblock3to9$ugr-(.35*kfdblock3to9$sdugr)))
kfdblock3to9$IL=1
else kfdblock3to9$IL=0
}
这给了我50条警告,都说: “条件长度> 1,只使用第一个元素”
我想我当时对索引做错了,但我还是弄清楚了。非常感谢任何帮助。
答案 0 :(得分:2)
查看within
和ifelse
:
kfdblock3to9 <-
within(kfdblock3to9,
IL <- ifelse( gr < ugr - 0.35 * dugr, 1, 0)
)
within()
并非真的那么必要,但它可以使您的代码更容易理解,更容易理解。
为什么会出错?那是因为你的病情是矢量化的:试试
kfdblock3to9$gr<(kfdblock3to9$ugr-(.35*kfdblock3to9$sdugr))
你会看到它返回一个逻辑向量。现在,if()
子句一次只能处理一个布尔值。如果您有矢量化结果,则需要一个矢量化解决方案,即ifelse()
答案 1 :(得分:2)
为了解决您的问题,我建议这样的事情:
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");
}
答案 2 :(得分:2)
你想要的是一个逻辑测试。因此,您可以避免使用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)))
答案 3 :(得分:0)
在这种情况下,您不应该使用循环。无论何时将来使用循环,都需要使用索引:
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