我正在研究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循环,看着
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循环没有。
我缺少什么?
答案 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
。