2017-07-10 1 views
0

私は3つのデータフレームを持っています。最初のデータフレーム異なるデータフレームの1つのデータフレームに存在する文字列の出現を検索し、3番目のデータフレームのカウントを増やす方法

ID  Col1 
YY:22 0 
AA:44 1 
XX:11 1 
DD:99 0 

第3データフレームはCOLA、COLB、およびCOLCは、それぞれのCol1、Col2に及びCOL3に対応

ColA ColB ColC 

であるが、以下のように

ID  Col1 Col2 Col3 
XX:11 1  0  0 
YY:22 1  0  0 
ZZ:33 0  1  0 
AA:44 0  0  1 
BB:55 0  0  1 

第二のデータフレームは以下の通りでありますデータフレーム1から取得します。

最初に存在する2番目のデータフレームからIDを検索しようとしていますそれらが存在する場合、第3のデータフレーム内の対応するCol *をインクリメントする。

たとえば、 2番目のデータフレームからID YY:22を取得します。これは最初のデータフレームに存在し、次にどの列(Col1、Col2およびCol3から)に1があるか調べ、それに応じて3番目のデータフレームの対応する列をインクリメントします。この場合、YY:22は最初のデータフレームに1のCOL1を持つので、3番目のデータフレームでColAをインクリメントする必要があります。

編集: 予想される出力がある2が無関係であるのCol1データフレームに

ColA ColB ColC 
    2  0  1 

+0

第2のデータフレームの 'Col1'列は無関係ですか?おそらく '%in%'、 'merge'について読むでしょうか? – zx8754

答えて

2

は、我々が行うことができますdplyrを使用して「コル」列のsumを取得します:

df3 = df1 %>% 
    filter(ID %in% df2$ID) %>% 
    summarize_at(vars(Col1:Col3), sum) 

出力:

Col1 Col2 Col3 
1 2 0 1 

あなたはA、B、Cであることを、列名が必要な場合は、あなただけのakrunの答えのようにここでそれらの名前を変更することができます

names(df3) <- paste0("Col", LETTERS[1:3]) 
1

我々は「、2セットのIDのサブセット 『の間matchを使用することに基づいて、DF1』にすることができますし、 colSums

df3 <- as.data.frame.list(colSums(df1[match(df2$ID, df1$ID, nomatch = 0),-1])) 
names(df3) <- paste0("Col", LETTERS[1:3]) 
2

あなたが与えることができますsemi_joinからdplyrトリック:

library(dplyr) 
df3 <- df1 %>% 
    semi_join(df2, by ="ID") %>% 
    summarise_at(vars(Col1:Col3), funs(sum)) 
関連する問題