2014-09-19 76 views
3

我有一個大的數據集,我想分裂成單個單位。目前,這些單位障礙以NA標記,但我如何拆分它們?樣本集:在NA分割單列數據幀在R

df=matrix(c(1,2,3,4,NA,6,7,8,NA,10,11,12),ncol=1,byrow=TRUE) 

給我們

 [,1] 
[1,] 1 
[2,] 2 
[3,] 3 
[4,] 4 
[5,] NA 
[6,] 6 
[7,] 7 
[8,] 8 
[9,] NA 
[10,] 10 
[11,] 11 
[12,] 12 

我想這三個存儲在不同的變量,從而

a 
     [,1] 
[1,] 1 
[2,] 2 
[3,] 3 
[4,] 4 
b 
     [,1] 
[1,] 6 
[2,] 7 
[3,] 8 
c 
     [,1] 
[1,] 10 
[2,] 11 
[3,] 12 

這是否有道理?謝謝。

回答

1

我不確定是否通過「數據集」表示您的意思是一個真正的矩陣或data.frame。這裏有一個data.frame例如矩陣是相似

df <- data.frame(a=c(1,2,3,4,NA,6,7,8,NA,10,11,12)) 
gg <- ifelse(is.na(df$a),NA, cumsum(is.na(df$a))) 
split(df, gg) 

我們只是使用gg作爲一個新的變量,每次我們看到一個NA,所以我們可以把部分入組時間來算的。我們還保留NA值來降低它們的分裂。最後split()與這個新的分類變量做我們想要的。使用splitcumsum去除缺失值後

$`0` 
    a 
1 1 
2 2 
3 3 
4 4 

$`1` 
    a 
6 6 
7 7 
8 8 

$`2` 
    a 
10 10 
11 11 
12 12 
+0

這是偉大的,謝謝!要將這些結果分配給其他變量,是否將<?(split(df,gg)$「0」)等適當?這可能不是最有效的,但我明白現在正在做什麼。 – eschultz 2014-09-19 20:16:52

+0

除非你真的有很好的理由,否則我不會分裂他們。像這樣使用命名列表比大多數變量更容易。但是如果你真的想,像'list2env(setNames(split(df,gg),letters [0:max(gg,na.rm = T)+1]),envir = globalenv())''會更多直接也許。 – MrFlick 2014-09-19 20:20:00

2

一號線的解決方案:

split(df[!is.na(df)],cumsum(is.na(df))[!is.na(df)]) 
$`0` 
[1] 1 2 3 4 

$`1` 
[1] 6 7 8 

$`2` 
[1] 10 11 12