4

在过去的两天里,我搜索了论坛和网络,并分解了我的脚本以尝试找到问题,但由于某种原因,我无法让它在第一行之外正常工作:

numbers <- mtcars[1:6,]

nnn <- c(1:(nrow(numbers)))

for (i in nnn){
  ly <- numbers[i,]
  numbers[i,12]<- sum(abs(ly) < 5e0)
}

这将返回:

> numbers
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb V12
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4   6
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4  NA
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1  NA
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1  NA
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2  NA
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1  NA

可以看到,当 i 为 1 时,ly 是马自达 rx4 行,它执行

sum(abs(ly) < 5e0)

正确,将值 6 放在新的第 12 列中。然而,除此之外,即使我已经确定它正确地循环通过 i,并为 i 的每次迭代正确返回 ly,它也不会计算行 2:5 的总和部分

对于大多数人来说,我在这里做错了什么可能真的很明显,但对于我的生活,我无法选择它。我是 R 和编程的新手,几乎是自学成才,在过去的几周里,到目前为止,我已经为循环和脚本编写了很多成功的作品,但这让我目瞪口呆。我们研究小组中使用 Matlab 的其他人和我一起解决了这个问题,问题和我一样,她也不明白为什么它也不起作用。

到目前为止,我使用 mtcars 只是为了测试循环,以便论坛上的人可以轻松访问它。一旦我知道它有效,我会为我的数据集(非常大)翻译它。

4

2 回答 2

3

在 R 中通常不需要使用 for 循环。更类似于 R 的解决方案是使用apply

apply(numbers, 1, function(x) sum(abs(x) < 5e0))
        Mazda RX4     Mazda RX4 Wag        Datsun 710    Hornet 4 Drive
                6                 6                 7                 6
Hornet Sportabout           Valiant
                6                 6

将其添加为列只涉及:

numbers$V12 = apply(numbers, 1, function(x) sum(abs(x) < 5e0))

关于您的代码的一些注释:

  • 无需1:(nrow(numbers))c.
  • 生成索引向量可以更容易地使用seq_len,即seq_len(nrow(numbers))
于 2013-05-10T05:32:37.543 回答
2

在您的第一次迭代之后,该V12列将添加到您的numbersdata.frame。因为该列包含NA第二行,所以所有后续迭代都将NAsum(abs(ly) < 5e0)操作中包含 a,因此返回NA. 一个快速的解决方法是添加na.rm = TRUE到该sum调用中。但正如@Paul 指出的那样,有更好的方法来做你想要实现的目标。其中之一:

numbers$extra.col <- rowSums(abs(numbers) < 5)
于 2013-05-10T05:35:04.303 回答