2016-08-25 6 views
0

大規模なデータフレームのサブセットを2つの列、ColAとColB(下記)に基づいて作成したいと考えています。 ColAの各変数(たとえばA、B、C ...)については、ColBの最初の変数の各出現に対応する行を抽出したいと思います。したがって、DF1:列内の最初の変数のすべての部分集合R行

ColA ColB ColC 
A  Red  7thing 
A  Red  OneBot 
A  Blue BotOne 
B  Green Thing7 
B  Green Twosies 
B  Green Square 
B  Yellow Circle 
B  Yellow Polygon 
B  Purple Triangle 
B  White Octagon 
C  Orange Cube 
C  Black Line 

はDF2になる:

ColA ColB ColC 
A  Red  7thing 
A  Red  OneBot 
B  Green Thing7 
B  Green Twosies 
B  Green Square 
C  Orange Cube 

私はCOLCで重複を懸念していないですし、COLBにおける変数の出現数にはパターンがありません。私が見つけた関連するサブセッティング戦略は、独自のケースを抽出することに重点を置いていましたが、最初の変数タイプのすべての選択を許可する方法を考案せず、何らかの援助に感謝します。

I(例えばSubset first n occurrences of certain value in dataframe in R

DF2 <- DF1[match(unique(DF1$ColB), DF1$ColB),] 

を試み...可変コンテンツが既知である場合、変数を標的サブセットが、これらは一見適切ではありません。

+1

あなたはどのようなコードを試してみました?にしている使用してアプローチSOはコーディングサービスではないコーディングリソースです – Nate

+0

私はポストを編集していくつかのコードを追加しましたが、役立つ場合はそれ以上を置くことができますが、それ以外の適切なコードのバグではありません。私の質問がサービスを期待しているように見えた場合にはお詫びします。そうでない場合、私のガイドとして使用されているすべての質問に対して、コードを含むSOガイドラインが示唆していたようです。 – SPZ

答えて

5

パワー:結果がある、あなたのデータを使用して

dat[with(dat, ColB == ave(ColB, ColA, FUN=function(x) head(x,1))),] 

# ColA ColB ColC 
#1  A Red 7thing 
#2  A Red OneBot 
#4  B Green Thing7 
#5  B Green Twosies 
#6  B Green Square 
#11 C Orange Cube 

あなたのオリジナルのロジックを使用して、可能性もバックだけColA/ColBの非重複レコードの上merge:と

merge(dat, dat[c("ColA","ColB")][!duplicated(dat$ColA),]) 
+0

Wonderful、併合戦術についても指摘してくれてありがとう。 – SPZ

2

あなたが望むものを達成するためにdplyrを使用することができます。

library(dplyr) 
df2 <- df1 %>% group_by(ColA) %>% filter(ColB == first(ColB)) 

まずgroup_byColA、その後、filterColBColBfirst値に等しい行だけを維持します。各グループの最初のColBにすべてColB例を比較するために、ベースRにおけるave

print(df2) 
##Source: local data frame [6 x 3] 
##Groups: ColA [3] 
## 
## ColA ColB ColC 
## <fctr> <fctr> <fctr> 
##1  A Red 7thing 
##2  A Red OneBot 
##3  B Green Thing7 
##4  B Green Twosies 
##5  B Green Square 
##6  C Orange Cube 
+0

なぜあなたはdownvotedているのか分かりませんか?これは完全に正常に動作します。 – thelatemail

+0

@thelatemail:サポートいただきありがとうございます! OPが彼/彼女が探しているものを取得する限り、私は良いです。 – aichao

+0

aichaoとthelatemailに感謝しますが、このgroup_byアプローチは簡単で便利です! – SPZ

3

別のアプローチ

df[df$ColB %in% unlist(aggregate(ColB~ColA, df, function(x) head(x, 1))[2]), ] 

# ColA ColB ColC 
#1  A Red 7thing 
#2  A Red OneBot 
#4  B Green Thing7 
#5  B Green Twosies 
#6  B Green Square 
#11 C Orange Cube 
3

それは大きなデータセットであるため、data.table

library(data.table) 
setDT(df1)[df1[, .I[ColB==ColB[1L]], ColA]$V1] 
# ColA ColB ColC 
#1: A Red 7thing 
#2: A Red OneBot 
#3: B Green Thing7 
#4: B Green Twosies 
#5: B Green Square 
#6: C Orange Cube 

それとも.SD

setDT(df1)[, .SD[ColB==ColB[1L]], ColA] 
関連する問題