2012-08-07 109 views
1

我想有一個函數來拆分數據幀是這樣的:拆分一個數據幀動態

q1 q2 q3 q4 
1 4 0 33 
8 5 33 44 
na na na na 
na na na na 
3 33 2 66 
4 2 3 88 
6 44 5 99 

我們將得到2個dataframes:

d1 
q1 q2 q3 q4 
1 4 0 33 
8 5 33 44 

d2 
3 33 2  66 
4 2 3  88 
6 44 5  99 

的ob1中的d1和d2不是固定的。這意味着我們不知道數據框中的obs以及有多少obs是NAs。

回答

1

假設DF是數據幀。由於沒有明確說明分割標準是什麼,我們假設任何一行所有的NA都是一個分行。如果其他一些標準適當地更改第一行:

isNA <- apply(is.na(DF), 1, all) 
split(DF[ !isNA, ], cumsum(isNA)[ !isNA ]) 
+0

+1我被這種難以置信的簡單和優雅同時錯綜複雜的風格所震撼。 – 2013-03-24 00:28:34

0

首先,讀入您的數據,以便將「na」轉換爲實際的NA值。

mydf <- read.table(
    header = TRUE, 
    na.strings="na", 
    text = "q1 q2 q3 q4 
      1 4 0 33 
      8 5 33 44 
      na na na na 
      3 33 2 66 
      4 2 3 88 
      6 44 5 99") 

其次,弄清楚哪裏拆分您data.frame

# Find the rows where *all* the values are `NA` 
RLE <- rle(rowSums(is.na(mydf)) == ncol(mydf))$lengths 
# Use that to create "groups" of rows 
RLE2 <- rep(seq_along(RLE), RLE) 
# Replace even numbered rows with NA -- we don't want them 
RLE2[RLE2 %% 2 == 0] <- NA 

第三,分裂您data.frame

split(mydf, RLE2) 
# $`1` 
# q1 q2 q3 q4 
# 1 1 4 0 33 
# 2 8 5 33 44 
# 
# $`3` 
# q1 q2 q3 q4 
# 4 3 33 2 66 
# 5 4 2 3 88 
# 6 6 44 5 99 

然而,這一切有些猜測,因爲你的聲明說:「這意味着我們不知道數據框中的obs以及NAs有多少obs「不是很清楚。在這裏,我假設您想要在遇到整行NA值時分割數據。