2014-01-15 73 views
1

我的問題是爲什麼最後一條語句「a < - ...」能夠爲列表中的數據框提供一個子集,但是當我嘗試自動化使用for循環處理列表中的所有數據框我遇到了各種警告,而不是我正在尋找的答案?使用for循環對數據框列表進行子集

time <- c(1:20) 
temp <- c(2,3,4,5,6,2,3,4,5,6,2,3,4,5,6,2,3,4,5,6) 
data <- data.frame(time,temp) 

tmp <- c(1,diff(data[[2]])) 
tmp2 <- tmp < 0 
tmp3 <- cumsum(tmp2) 
data1 <- split(data, tmp3) 

#this does not work. I want to automate the successful process below through all data frames in the list "data1" 
for(i in 1:length(data1)){ 
    finale[i] <- subset(data1[[i]], data1[[i]][,2] > 3) 
} 

#this works to give me a part of what I want 
a <- subset(data1[[1]], data1[[1]][,2] >3) 

回答

1

也許你可能想使用for循環

finale <- vector("list", length(data1)) 
for(i in 1:length(data1)){ 
    finale[[i]] <- subset(data1[[i]], data1[[i]][,2] > 3) 
} 

它的工作原理,因爲我預分配類型和長度finalelapply

lapply(data1, function(x) subset(x, x[,2]>3)) 

同樣的結果嘗試一下,沒不適合你,因爲你沒有聲明finale應該是什麼。

+0

可以將其與一個循環來完成?我的真實數據比較複雜,我的情況比「> 3」更復雜,它基於列表中每個數據框中的最小值。 – user1667477

+0

太棒了!謝謝Jilber!我知道這是問題,但是不知道如何指定應該開始的結局。現在看起來這麼簡單,不知道我會不會明白。謝謝! – user1667477

+0

@ user1667477如果這可以幫助你,那麼你可以upvote它,如果它回答你的問題,你可以標記爲接受;) –

0

您正在嘗試將矢量(1D objetc)中的data.frame(2D對象)保存。只要定義finale爲列表和代碼將工作:

time <- c(1:20) 
temp <- c(2,3,4,5,6,2,3,4,5,6,2,3,4,5,6,2,3,4,5,6) 
data <- data.frame(time,temp) 

tmp <- c(1,diff(data[[2]])) 
tmp2 <- tmp < 0 
tmp3 <- cumsum(tmp2) 
data1 <- split(data, tmp3) 

#this does not work. I want to automate the successful process below through all data frames in the list "data1" 
finale <- vector(mode='list') 
for(i in 1:length(data1)){ 
    finale[[i]] <- subset(data1[[i]], data1[[i]][,2] > 3) # Use [[i]] instead of [i] 
} 

要保存所有在1個data.frame:

finale <- do.call(rbind, finale) 
+0

這個答案是如何不同於我的? –

+1

你在問我爲什麼發佈一個等於你的答案?簡單:當我開始寫它時,這裏沒有答案。 – Rcoster