2017-06-05 8 views
1

サブセット化のエンドポイントとして列のいくつかのNA値を使用してデータテーブルをサブセット化しようとしています。ここで私が何を意味するかを示すために、いくつかの偽のデータを次のとおりです。サブセットのエンドポイントとしてNA(または他の値)を使用してデータテーブルをサブセット化する

require(data.table) 
set.seed(34) 
somestuff <- c(NA,'sdr','utyrd','ytrd','fc',NA,NA,'09h','87h',NA,NA,NA,'0ij','5fdg','g7','h8o7hy') 
someotherstuff <- sample(LETTERS,length(somestuff)) 

dat <- data.table(somestuff,someotherstuff) 

私は、次の3つのサブセット(以下DAT1、DAT2、DAT3)に「DAT」サブセットしたいと思います。 NAを使用して行を削除するだけでなく、最初の列のNA値の一部をサブセットの非包含的なエンドポイントとして活用することも基本的に可能です。言い換えれば、サブセット化のためのグループは、列内のNAsの単一または複数のセルによって分離される。

dat1 <- dat[2:5] 
dat2 <- dat[8:9] 
dat3 <- dat[13:16] 

私が使用する実際のデータは列にいくつかのサブセットと、通常、複数の連続したNA値を持つことになりますし、私は毎週、このデータを取得する際には、別の場所でこれらのNAのを持っています。列内の共通要素(NAなど)または文字列を使用してサブセット化エンドポイントを指定することで、サブセット化する効率的な方法が分かっているかどうかを知りたいと考えました。私はこれらを最大限に活用する傾向がありますが、私はdata.tableソリューションには賛成できません。私はこのようなスプリット()しようとしてきた:NAなし

split(dat,by=is.na(dat$somestuff)) 

だけでなく、行にカウンタを追加するが、それは一緒に来ていないようです。何かご意見は?

答えて

2

我々はdata.table

dt <- dat[, grp := rleid(is.na(somestuff))][!is.na(somestuff), .SD]   
unname(split(dt, by = "grp", keep.by = FALSE)) 
#[[1]] 
# somestuff someotherstuff 
#1:  sdr    Y 
#2:  utyrd    V 
#3:  ytrd    F 
#4:  fc    W 

#[[2]] 
# somestuff someotherstuff 
#1:  09h    N 
#2:  87h    H 

#[[3]] 
# somestuff someotherstuff 
#1:  0ij    K 
#2:  5fdg    A 
#3:  g7    C 
#4: h8o7hy    I 

それともこれは、グループの割り当てを追加、base R

i1 <- is.na(dat$somestuff) 
split(dat[!i1], cumsum(i1)[!i1]) 
+1

うわーで行うことができるのlistrleid、その後splitでグループ化変数を作成することができますreleid()はまさに私がやろうとしていたものでした。前にこれを見たことはありません。パーフェクトです。素晴らしい答えとそれはdata.table.verseにもあります。どうもありがとうございました。 –

+1

@Frankありがとう、それはよりコンパクトで、私は 'keep.by'引数については知らなかった – akrun

関連する問題