2016-07-28 12 views
0

私は以下のような1つのデータフレーム(df1)を持っています。企業が特定の市場で活躍していた年を示します。R:別のデータフレームの "countif"値を持つデータフレームに新しい列を作成するには?

Company Country Year 
A  Austria 2010 
A  Germany 2010 
A  Austria 2011 
B  Italy 2010 

次に、次のような2番目のデータフレーム(df2)があります。それは、ダミー変数としての投資タイプ別に、ある時点におけるある国の企業のすべての投資をリストアップします。

Company Country Year JointVenture M&A Greenfield 
A  Austria 2010 1    0 0 
A  Austria 2010 0    1 0 
A  Austria 2010 1    0 0 
... 

私の質問は以下のようになりました:私はにしたいDF2に示すように「COUNTIF」を含め、各投資型のをDF1に新しい列を追加します。たとえば、新しいDF1:

Company Country Year Count.JointVenture Count.M&A Count.Greenfield 
A  Austria 2010 2     1   0 
A  Germany 2010 ........... 
A  Austria 2011 
B  Italy 2010 

はまた、どのように私は、ダミー変数(; 0の場合は0 1 0>の場合)にこれらのカウントを変形DF1する新しい列を追加することができるだろうか?

この基本的な質問を申し訳ありませんが、私は既存のスレッドで適切なソリューションを見つけられませんでした。

乾杯、 マーティン

答えて

2

集計()とifelse()私はアリーナの中に私のdata.table試みを投げる

# test data 
df <- data.frame(Company = rep("A", 3), 
       Country = rep("Austria", 3), 
       Year = rep(2010, 3), 
       JointVenture = c(1,0,1), 
       MnA = c(0,1,0), 
       Greenfield = rep(0,3)) 
# this is the new df 
counts <- aggregate(cbind(JointVenture, MnA, Greenfield)~Country+Company+Year, data = df, FUN = sum) 

# dummy 
counts$dummyJointVenture <- ifelse(counts$JointVenture > 0, 1, 0) 
counts$dummyMnA <- ifelse(counts$MnA > 0, 1, 0) 
counts$dummyGreenfield <- ifelse(counts$Greenfield > 0, 1, 0) 
+0

に滞在するfull_joinmergeを交換してください。 – zacdav

+0

@ zacdavええ、それは良い点です。私はデータのサイズについて考慮していませんでした。 choubiを使用すると、より大きなデータセットの実装が改善されます。 – carlo

+0

@carlo - おかげで、私は集計を試みた()の引数: aggregatedbyguo < - 骨材(CBIND(acquisition.dum、ipo.dum、\t capincrease.dum、\t jv.dum、\t merger.dum、\t fdi.dum )〜guo + country.iso + year、data = totaldat_filtered、FUN = sum) をguo、country.iso、yearで集計します。しかし、私は正しい値が得られません(例えば、買収が1つしかない場合、買収の場合は3、その他の場合は2)。 私のコードについて何が間違っていますか? 郭の特定の組み合わせのためによろしく、マーティン – deca

1

を機能使用:

df <- fread("Company Country Year 
      A  Austria 2010 
      A  Germany 2010 
      A  Austria 2011 
      B  Italy 2010") 

df2 <- fread("Company Country Year JointVenture M&A Greenfield 
       A  Austria 2010 1    0 0 
       A  Austria 2010 0    1 0 
       A  Austria 2010 1    0 0") 

setkey(df2, Company, Country, Year) 
df2[,c("JointVenture", "M&A", "Greenfield") := .(sum(JointVenture), sum(`M&A`), sum(Greenfield)), by=.(Company, Country, Year)] 
merge(x=df, y=unique(df2), by=c("Company", "Country", "Year"), all.x=T, all.y=F, suffixes = c("", "Count.")) 

になり
Company Country Year JointVenture M&A Greenfield 
1:  A Austria 2010   2 1   0 
2:  A Austria 2011   NA NA   NA 
3:  A Germany 2010   NA NA   NA 
4:  B Italy 2010   NA NA   NA 
1

dplyr::summarise_eachおよびmergeをMartinのデータと使用します。

df <- fread("Company Country Year 
      A  Austria 2010 
      A  Germany 2010 
      A  Austria 2011 
      B  Italy 2010") 

df2 <- fread("Company Country Year JointVenture MA Greenfield 
       A  Austria 2010 1    0 0 
       A  Austria 2010 0    1 0 
       A  Austria 2010 1    0 0") 
library(dplyr) 
df2 %>% 
    group_by(Company, Country, Year) %>% 
summarise_each(funs(sum), JointVenture:Greenfield) %>% 
full_join(df, by = c("Company", "Country", "Year")) -> df 

編集:@zacdavからの入力でsummarise_eachsummariseを交換し、脇、これはダミー部のための大規模なデータと退屈になるようdplyr

+0

'summarise_each(funs(sum)、JointVenture:Greenfield)' – zacdav

+0

@ zacdavありがとう!代わりにこのソリューションを追加しました。 – Choubi

関連する問題