for循环包含小数并将结果存储在向量

时间:2017-03-15 12:10:26

标签: r loops vector

我正在研究R中的for循环,我不得不将结果存储在向量中。我知道这是一个非常普遍的答案,我的问题不存在,但让我们继续下订单。

我收到了这些数据:

# here the data
alpha <- c(1,2,3,4,5,6)
beta <- c(0.1,0.5,0.3,0.4,0.5,0.6)
data <- data.frame(alpha, beta)

我做了一个简单的函数,选择高于某个阈值的数据:

# here the function
funny <- function(x,k)
{x[x[,2]>=k,]}

# here an example of the function
funny(data,0.5)

      alpha beta
2     2  0.5
5     5  0.5
6     6  0.6

但我想要的是超过阈值的行数,所以:

# here the result wanted
nrow(funny(data,0.5))
[1] 3

所以我得到一个问题:在函数的参数k的变化下,有多少行超过了阈值?我希望将结果放在矢量中。我创建了一个for循环,看着

For loop in R with increments

Saving results from for loop as a vector in r

我创造了这个:首先让我们看看一切是否正常:

# here the sequence   
s <-seq(0.1,0.6, by = 0.1)

# here the I loop
for(i in s) {print(nrow(funny(data,i)))}
[1] 6
[1] 5
[1] 4
[1] 4
[1] 3
[1] 1

但显然这不存储在矢量中。问题出在这里。我试过了:

# already written sequence   
s <-seq(0.1,0.6, by = 0.1)

# here the empty vector
vec <- vector("numeric")

# here the II problematic loop
for(i in s) {vec[i]<-(nrow(funny(data,i)))}
vec

这里是我不想要的结果,我期待像[1] 6 5 4 4 3 1

这样的东西

[1] 0 0 0 0 0 0

另外的信息: 我试过这样的事情:

# sequence * 10
s <-seq(1,6, by = 1)

# here the vector
vec <- vector("numeric")
# and the III loop, that it works now.

for(i in s) {vec[i]<-(nrow(funny(data,i/10)))}
vec
[1] 6 5 5 4 3 1

但是我不喜欢这个,因为我不明白为什么III工作以及为什么II循环没有。

我缺少什么?

1 个答案:

答案 0 :(得分:3)

我们可以尝试sapply,它会返回一个向量

sapply(s, function(x) nrow(funny(data, x)))

#[1] 6 5 4 4 3 1

至于为什么你的循环II无效。如果你这样做,

for(i in s) {
  print(i)
}

你会得到

[1] 0.1
[1] 0.2
[1] 0.3
[1] 0.4
[1] 0.5
[1] 0.6

因此,当您尝试存储在循环II vec[i] <-中时,您实际上在第一种情况下执行vec[0.1]这是不正确的。

要更正循环,请尝试

for(i in seq_along(s))  {vec[i]<-(nrow(funny(data,s[i])))}
vec
#[1] 6 5 4 4 3 1

seq_along(s)将返回#[1] 1 2 3 4 5 6