编写一个代码来计算得分,并将它们添加到data.frame中

时间:2012-05-22 11:30:05

标签: r for-loop

我有一个包含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,只使用第一个元素”

我想我当时对索引做错了,但我还是弄清楚了。非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

查看withinifelse

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