2016-07-28 4 views
0

다음과 같은 하나의 데이터 프레임 (df1)이 있습니다. 회사가 특정 시장에서 활동 한 해를 나타냅니다.R : 다른 데이터 프레임의 "countif"값을 사용하여 데이터 프레임에 새 열을 만드는 방법은 무엇입니까?

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

이제 두 번째 데이터 프레임 (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 

, 어떻게 그때 더미 변수로이 수를 변환 DF1 새로운 열을 추가 할 수있을 것입니다 (1 0>의 경우 0 0 경우)?

이 기본 질문에 감사드립니다.하지만 기존 스레드에 맞는 솔루션을 찾지 못했습니다.

건배, 마틴

답변

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_join하여 merge 대체. – zacdav

+0

@ zacdav 예, 좋은 지적입니다. 데이터의 크기를 고려하지 않았습니다. choubi로 입력하면 큰 데이터 세트를 더 잘 구현할 수 있습니다. 집계 (cbind (acquisition.dum, ipo.dum, \t capincrease.dum, \t jv.dum, \t merger.dum, \t fdi.dum - aggregatedbyguo <- – carlo

+0

@carlo 덕분에, 나는 총() 인수 시도) ~ guo + country.iso + year, data = totaldat_filtered, FUN = sum) guo, country.iso 및 year로 집계하십시오. 그러나 올바르지 않은 값을 얻습니다 (예를 들어, 하나의 취득 만있는 경우에는 acquisition.dum에 대해 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_eachmerge을 사용하십시오.

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

관련 문제