2013-07-12 74 views
0

請允許我詳細說明。基本上,我有一個有4列的數據框,其中一列有NA。當NA發生時,它們總是以組的形式出現。我正在循環遍歷這個數據框,看着列。我想要做的就是儘快找到NA,我想在達到正常值之前,將該行的數據框與最後一次出現NA的行進行子集劃分。如何基於下一次出現在R中爲數據框子集?

因此,舉例來說,假設我們看看我的數據幀DF:

C1 C2 C3 C4 C5 C6 
R1 2 1 2 1 0 0 
R2 2 2 1 1 0 0 
R3 0 0 1 1 2 1 
R4 2 2 1 NA 0 0 
R5 0 0 1 NA 2 1 
R6 0 0 1 NA 2 1 
R7 2 2 1 NA 0 0 
R8 0 0 1 1 2 1 
R9 2 1 2 1 0 0 
R10 2 2 1 1 0 0 
R11 0 0 1 1 2 1 
R12 2 2 1 NA 0 0 
R13 0 0 1 NA 2 1 
R14 0 0 1 NA 2 1 

當我再通過排DF行循環,我在第4行來翻過第一NA,然後我想子集df從第4行到第7行,這是最後一個NA在這個特定的一組NA中的位置。

子集:

R4 2 2 1 NA 0 0 
R5 0 0 1 NA 2 1 
R6 0 0 1 NA 2 1 
R7 2 2 1 NA 0 0 

請注意,我沒有用NA子集中的所有行,只是目前的「組」 NA的我一直在尋找。我沒有從第12-14行開始分組。

我該怎麼做?

+0

你想要列表中的每一組這些行(連續NA行)? (假設你有更多的行,這可能會發生多次)。 – Arun

+0

也只有C4總是有NAs嗎? – Arun

+0

@Arun,我希望將子集放入一個新的數據框中,所以看上面的例子,只要遇到第4行中的NA,我就想在NA中找到最後一個NA,然後進行相應的子集。所以基本上我想我的子集是:subset = df [4:7,]。問題是要找出最後一行去。 – user2560984

回答

1

一種方法是連續NA S上的IDS存儲在一個列表中,然後子集,但是你想以後(使用lapply或明確for-loops

isna <- is.na(df$C4) 
idx <- which(isna) 
rr <- rle(isna) 
idx <- split(idx, rep(seq(sum(rr$values)), rr$lengths[rr$values])) 
# $`1` 
# [1] 4 5 6 7 

# $`2` 
# [1] 12 13 14 

它們對應於行號......現在,你可以子集:

使用lapply

oo <- lapply(idx, function(ix) { 
    this_sub <- df[ix, ] 
    # do whatever you want 
}) 

使用for-loop

for (i in seq_along(idx)) { 
    this_sub <- df[idx[[i]], ] 
    # do whatever you want 
} 
0

如果你想有一個包含在列「C4」你這樣做有NA的所有行數據幀:

df[which(is.na(df$C4)), ] 

其中df是你的數據幀。

希望它有幫助。

+0

這將分離所有的NA,但在我的數據框中,行按時間順序排列,而NA出現在不同的組中,它們不在一條連續的行中。這就是爲什麼我只想找到我正在看的那組NA中的最後一個NA。我會編輯上面的表格,以便更好地理解 – user2560984

相關問題