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循环的原因:-但是,你使用我的情况的例子更有意义。谢谢我将尝试所有这些解决方案,从中学习。看看我的情况下哪个更快(我会添加计时器)会很有趣。@AdamKilpatrickapply
style循环是你需要习惯的。一旦完成,通常会导致代码更加紧凑,有时还会提高速度。虽然
的在R中完全有效,但对我来说,紧凑性就是它的卖点。
numbers$extra.col <- rowSums(abs(numbers) < 5)