2017-03-15 93 views
1

我正在R的for循環工作,我不得不將結果存儲在一個向量中。我知道這是一個相當普遍的答案,我的問題不在那裏,但讓我們繼續進行訂單。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 

所以我有一個問題:有多少行超過閾值在t他的變化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環沒有。

我缺少什麼?

回答

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