2017-07-25 81 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