R 按数据帧行计算小于x的值的数目

R 按数据帧行计算小于x的值的数目,r,for-loop,sum,dataframe,R,For Loop,Sum,Dataframe,在过去的两天里,我在论坛和网站上到处搜索,并分解了我的脚本,试图找到问题所在,但由于某种原因,我无法让它在第一行之外正常工作: numbers <- mtcars[1:6,] nnn <- c(1:(nrow(numbers))) for (i in nnn){ ly <- numbers[i,] numbers[i,12]<- sum(abs(ly) < 5e0) } 正如你所看到的,当我1岁时,ly是马自达rx4行,它执行 sum(abs(ly)

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

numbers <- mtcars[1:6,]

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

for (i in nnn){
  ly <- numbers[i,]
  numbers[i,12]<- sum(abs(ly) < 5e0)
}
正如你所看到的,当我1岁时,ly是马自达rx4行,它执行

sum(abs(ly) < 5e0)
sum(abs(ly)<5e0)
正确地将值6放置在新的第12列中。然而,除此之外,尽管我已经确定它正确地循环通过I,并且对于I的每次迭代都正确地返回ly,但它并没有计算第2:5行的和部分

对大多数人来说,我在这里做错了什么可能是显而易见的,但就我的一生而言,我无法选择它。我是R和编程新手,自学成才,在过去的几周里,我已经为循环和脚本写了很多成功的东西,但这让我很失望。我们研究小组中另一个使用Matlab的人和我一起研究了这个问题,问题和我一样,她也不明白为什么它不起作用


到目前为止,我使用mtcars只是为了测试这个循环,这样论坛上的人就可以很容易地访问它。一旦我知道它有效,我会将它转换为我的数据集(它相当大)。

在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
apply(数字,1,函数(x)和(abs(x)<5e0))
马自达RX4马自达RX4 Wag Datsun 710大黄蜂4路
6                 6                 7                 6
大黄蜂
6                 6
将其添加为列仅涉及:

numbers$V12 = apply(numbers, 1, function(x) sum(abs(x) < 5e0))
numbers$V12=apply(数字,1,函数(x)和(abs(x)<5e0))
关于代码的一些备注:

  • 无需使用
    c
    包装
    1:(nrow(number))
  • 使用
    seq_len
    可以更容易地生成索引向量,即
    seq_len(nrow(number))

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

numbers$extra.col <- rowSums(abs(numbers) < 5)

numbers$extra.col Dang,我刚刚发现了它,就像你发现+1一样!另一个好的选择是首先在循环内构建一个向量,然后将其分配给
mtcars
。啊,我明白了。这对于NA的存在有很大的意义。首先在循环中构建一个向量听起来不错…我猜在循环之后,我会用cbind将它分配给mtcars…?或者简单地使用
number$extra.col=vector\u builded\u in\u loop
,就像@flodel在他的回答中使用的那样。+1表示一个特定的问题,包括一个可复制的例子。我有人回答论坛问题,他们应该使用apply et all工具…他们通常在此时找到我,这就是为什么我使用for循环的原因:-但是,你使用我的情况的例子更有意义。谢谢我将尝试所有这些解决方案,从中学习。看看我的情况下哪个更快(我会添加计时器)会很有趣。@AdamKilpatrick
apply
style循环是你需要习惯的。一旦完成,通常会导致代码更加紧凑,有时还会提高速度。虽然
在R中完全有效,但对我来说,紧凑性就是它的卖点。
numbers$extra.col <- rowSums(abs(numbers) < 5)