2016-04-16 35 views
0

我需要做迭代評估數據集的方差,同時我在每一步中逐行減少data.frame。作爲一個例子逐步減少循環中的輸入數據幀

data <- matrix(runif(100),10,10) 
perc <- list("vector") 
sums <- sum(data) 

for (i in 1:nrow(data)) {  
    data <- data[-1,] 
    perc[[i]] <- sum(data)/sums # in reality, here are ~8 additonal lines of code 
} 

我不喜歡那個data在每一步被重新初始化,和與一個錯誤,當data被清空循環中斷。 所以問題是:? 1.如何遞增的方式表達data <- data[-1,](類似tmp <- data[-c(1:i),],它不工作 2.有沒有辦法停止循環,最後一行從數據刪除之前

回答

1

你可以嘗試

set.seed(123) 
data <- matrix(runif(100),10,10) 
sums <- sum(data) 
perc <- lapply(2:nrow(data),function(x) sum(data[x:nrow(data),]/sums)) 

上面的代碼產生相同的結果作爲您的原始代碼,但沒有錯誤消息,並且不修改data

perc1 <- list() 
for (i in 1:nrow(data)) {  
    data <- data[-1,] 
    perc1[[i]] <- sum(data)/sums 
} 
identical(perc,perc1) 
#[1] TRUE 

如果您希望保留for環,以環內執行其它計算,你可以嘗試:

for (i in 2:nrow(data)) { 
    perc[[i-1]] <- sum(data[i:nrow(data),])/sums 
    # do more stuff here 
} 
identical(perc,perc1) 
#[1] TRUE 

如果您使用的是循環索引i爲循環內的其他計算,你將最有可能需要用i-1替換它。這可能取決於計算的內容。

1

您可以使用lapply

res <- lapply(2:nrow(data), function(i)sum(data[i:nrow(data),])/sums) 
1

你可以寫這樣的環部分:

for (i in 2:nrow(data)) {  
    perc[[i - 1]] <- sum(data[i:nrow(data),])/sums # in reality, here are ~8 additonal lines of code 
}