我在计算数字方面仍有问题。
试图找到第一行[-0.5,0.5]内的数字量,以及第二行中相同范围外的数字量。
我使用abc = rnorm(100, mean=0, sd=1)
。所以我总共有100个数字,但我只有35个数字在范围内,35个在范围之外,不会加起来为100个。
length(abc[abc>=-0.5 & abc<=0.5])
[1] 35
length(abc[abc<-0.5 & abc>0.5])
[1] 35
然后我尝试了:
length(which(abc>=-0.5 & abc<=0.5))
[1] 40
length(which(abc<-0.5 & abc>0.5))
[1] 26
它仍然没有加起来100.出了什么问题?
答案 0 :(得分:10)
你在追求:
R> set.seed(1)
R> abc = rnorm(100, mean=0, sd=1)
R> length(abc[abc >= -0.5 & abc <= 0.5])
[1] 41
R> length(abc[abc < -0.5 | abc > 0.5])
[1] 59
出了什么问题
两件事:
abc < -0.5 & abc > 0.5
要求的值小于-0.5 且大于0.5 但是,你确实有:abc[abc<-0.5 & abc>0.5]
由于范围界定,这会有所不同。让我们分开吧:
R> abc[abc<-0.5 & abc>0.5]
[1] 1.5953 0.7383 0.5758 1.5118 1.1249 0.9438 <snip>
现在让我们看一下abc
R> abc
[1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE
您已更改abc
的值!这是因为<-
是赋值运算符。您已将abc
设为0.5 & abc > 0.5
。为避免这种情况,请使用间距(如我的代码所示)。
答案 1 :(得分:3)
当想要在这样的半径内外找到数字时,考虑绝对值会很有帮助,然后你只需进行一次比较:
length(abc[abs(abc)<=0.5])
[1] 41
length(abc[abs(abc)>0.5])
[1] 59
或者您可以使用cut
和table
在一行中执行此操作:
table(cut(abs(abc),c(-Inf,0.5,Inf)))
(-Inf,0.5] (0.5,Inf]
41 59
答案 2 :(得分:2)
作为捷径,你也可以这样做:
set.seed(1)
abc <- rnorm(100, mean=0, sd=1)
sum(abc>=-0.5 & abc<=0.5)
# [1] 41
sum(abc< -0.5 | abc>0.5)
# [1] 59
这是有效的,因为sum
将TRUE视为1,将FALSE视为0。
答案 3 :(得分:0)
或者通过subset
:
set.seed(1)
abc <- rnorm(100, mean=0, sd=1)
length(subset(abc, abc >= (-0.5) & abc <= 0.5))
[1] 41
length(subset(abc, abc < (-0.5) | abc > 0.5))
[1] 59