2017-07-25 97 views
0

我目前正試圖從多個數據幀(A1-A8)中讀出所有具有相同結構的數據和for循環。在for循環中,我想提取滿足特定條件的數據(在此情況下爲特定深度)。我嘗試了這與子集和if-else。我面臨的問題是,如果不滿足此條件,則for循環會中斷並且不執行以下步驟。這裏的例子:從多個數據幀中提取條件數據

Depth <- c(40,60,70,80,85,90) 
D2H <- c(-60,-65,-63,-67,-58,-66) 
A1 <- data.frame(Depth, D2H) 

for (i in 1:8) { 
    Ax <- get((paste("A",i,sep="")))# reads in the dataframe 
    A_40[i] <- subset(Ax$D2H, Ax$Depth == 40) #writes the value of D2H at depth 40 into the new vector 
    A_60[i] <- subset(Ax$D2H, Ax$Depth == 60) 
} 

因此,如果例如數據幀A3不包含Depth = 40,for循環被中斷。我怎樣才能克服這個問題?錯誤的方法?

我希望我能夠很好地描述這個問題,如果沒有,請告訴我,我會擴展描述。我非常感謝任何建議。

+1

那麼你會得到這種方法的錯誤?您可以嘗試使用'which()'來查找滿足條件的行,然後使用'length()'檢查令人滿意的行數。只有當長度大於'零'時,纔可以嘗試'subset()'。 – TUSHAr

回答

1

如果你要考慮使用的數據幀的列表,這樣的事情可能實現你以後

Depth <- c(40,60,70,80,85,90) 
D2H <- c(-60,-65,-63,-67,-58,-66) 
A1 <- data.frame(Depth, D2H) 

set.seed(123) ## these would be your other 7 data frames in your case 
A2 <- A1[sample(nrow(A1), nrow(A1), replace = TRUE),] 
A3 <- A1[sample(nrow(A1), nrow(A1), replace = TRUE),] 
A4 <- A1[sample(nrow(A1), nrow(A1), replace = TRUE),] 
A5 <- A1[sample(nrow(A1), nrow(A1), replace = TRUE),] 
A6 <- A1[sample(nrow(A1), nrow(A1), replace = TRUE),] 
A7 <- A1[sample(nrow(A1), nrow(A1), replace = TRUE),] 
A8 <- A1[sample(nrow(A1), nrow(A1), replace = TRUE),] 

mydflist <- list(A1, A2, A3, A4, A5, A6, A7, A8) 

newlist40 <- lapply(mydflist, function(x) subset(x$D2H, x$Depth == 40)) 
newlist60 <- lapply(mydflist, function(x) subset(x$D2H, x$Depth == 60)) 

編輯

newlist40.b <- lapply(newlist40, function(x) if(length(x)==0) x <- NA else x) 
newlist40.final <- unlist(lapply(newlist40.b, unique)) ## if you want unique values from each array in list 
# newlist40.final <- unlist(newlist40.b) # if you don't 

newlist60.b <- lapply(newlist60, function(x) if(length(x)==0) x <- NA else x) 
newlist60.final <- unlist(lapply(newlist60.b, unique)) ## if you want unique values from each array in list 
# newlist60.final <- unlist(newlist60.b) # if you don't 
+0

太棒了!謝謝!唯一的問題是我得到一個列表而不是一個向量作爲結果。有沒有辦法直接獲取矢量? – Niknak

+0

你想要一個具有唯一值的矢量,無論他們來自哪裏的數據幀?矢量應該是什麼樣子? – simone

+0

基本上是一個具有8個值的向量,我從數據框中讀取數據,如果沒有數據,則最好使用NA。 – Niknak

0

我覺得Simone的方式是最好的回答,但是如果你決定使用for循環,那麼這裏的修復與寫入if條件有關。

for (i in 1:8) { 
    Ax <- get((paste("A",i,sep="")))# reads in the dataframe 

    if (length(subset(Ax$D2H, Ax$Depth == 40) > 0) {A_40[i] <- subset(Ax$D2H, Ax$Depth == 40) 
    } else { A_40[i] = NA } 

    if (length(subset(Ax$D2H, Ax$Depth == 60) > 0) {A_60[i] <- subset(Ax$D2H, Ax$Depth == 60) 
    } else { A_60[i] = NA } 
} 
+0

是的,這也很好。我一直在嘗試使用if函數,但不知道如何。這看起來好多了!謝謝! – Niknak