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

问题描述 投票:1回答:4

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

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

r for-loop
4个回答
2
投票

看看withinifelse

kfdblock3to9 <- 
within(kfdblock3to9,
  IL <- ifelse( gr < ugr - 0.35 * dugr, 1, 0)
)

within()实际上并不是那么必要,但它可以让你的代码更容易阅读和理解。

为什么会出错?那是因为你的病情是矢量化的:试试

kfdblock3to9$gr<(kfdblock3to9$ugr-(.35*kfdblock3to9$sdugr))

你会看到它返回一个逻辑向量。现在,if()子句一次只能处理一个布尔值。如果你有矢量化结果,你需要一个矢量化解决方案,那就是ifelse()


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
投票

你想要的是一个逻辑测试。因此,你可以避免使用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)))

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
© www.soinside.com 2019 - 2024. All rights reserved.