2017-10-24 16 views
1

더의 NA가없는 경우에만 변수를 포함 :두 개의 데이터 프레임을 병합,하지만 난 병합 할 나는 두 개의 데이터 프레임이

df1 :

Date   Company Return 
1988-09-30 BELSHIPS 0.087 
1988-10-31 BELSHIPS 0.021 
1988-11-30 BELSHIPS 0.015 
1988-12-30 BELSHIPS -0.048 
1988-09-30 GOODTECH 0.114 
1988-10-31 GOODTECH 0.074 
1988-11-30 GOODTECH NA 
1988-12-30 GOODTECH NA 
1988-09-30 LABOREMUS -0.014 
1988-10-31 LABOREMUS 0.024 
1988-11-30 LABOREMUS 0.017 
1988-12-30 LABOREMUS 0.021 

df2가 :

Company 
BELSHIPS 
BIK BOK 
FARSTAD SHIPPING 
GOODTECH 
GYLDENDAL 

회사에서 두 데이터 프레임을 병합하고 싶지만 대신 NA가없는 회사 만 포함하려고합니다. 새로운 데이터 프레임 그러므로 다음과 같아야합니다

df3을 : 굿 테크는 반환에서의 NA를 가지고 LABOREMUS이 df2에 포함되어 있지 않기 때문에

Date   Company Return 
1988-09-30 BELSHIPS 0.087 
1988-10-31 BELSHIPS 0.021 
1988-11-30 BELSHIPS 0.015 
1988-12-30 BELSHIPS -0.048 

만 회사 BELSHIPS이 포함되어 있습니다.

나는 회사 전체가 아닌 NAs 만있는 행을 생략하기 때문에 작동하지 않는 df3 <- merge(df2, df1[!is.na(df1$Return)], by = "Company")을 시도했습니다.

이 문제를 해결할 수있는 방법에 대한 제안 사항이 있으십니까?

답변

2

자료 R 솔루션 :

# Select companies that have NA 
# You can also use unique on this 
foo <- df1$Company[is.na(df1$Return)] 
# Subset data frame where Company is within df2 and doesn't have NA 
subset(df1, Company %in% df2$Company & !Company %in% foo) 

#   Date Company Return 
# 1 1988-09-30 BELSHIPS 0.087 
# 2 1988-10-31 BELSHIPS 0.021 
# 3 1988-11-30 BELSHIPS 0.015 
# 4 1988-12-30 BELSHIPS -0.048 
+1

덕분에 사용이 트릭을 할 것 같다! –

+0

@VegardDyran 도와 주시겠습니까? :-)'merge'는 과도한 공격입니다 – PoGibas

1

테스트 데이터 :

df2 = data.frame(Company = c('BELSHIPS','GOODTECH'))                                            
df1 = data.frame(Company = c('BELSHIPS','BELSHIPS','BELSHIPS','GOODTECH','GOODTECH','GOODTECH','LABOREMUS','LABOREMUS','LABOREMUS'),Return = c(1,2,3,1,NA,NA,3,4,5))                                            

NA 행이 회사를 잡기 위해 which()unique() 사용 :

df3<-merge(df2, df1[df1$Company!=unique(df1[which(is.na(df1$Return)),'Company']),], by = 'Company')                                           
+1

@PoGibas의 대답을 받아 들였습니다. 처음 시도했지만 해결 방법도 효과가있는 것 같습니다. 고맙습니다 –

0

또한이 dplyr를 사용하여 작업을 수행 할 수 있습니다 :

df2 %>% 
    left_join(df1, by = "Company") %>% 
    group_by(Company) %>% 
    filter(sum(is.na(Return)) == 0) 

당신에게 제공합니다

# A tibble: 4 x 3 
# Groups: Company [1] 
    Company  Date Return 
    <chr>  <fctr> <dbl> 
1 BELSHIPS 1988-09-30 0.087 
2 BELSHIPS 1988-10-31 0.021 
3 BELSHIPS 1988-11-30 0.015 
4 BELSHIPS 1988-12-30 -0.048 
0

단순히 병합하고 함수를 na.omit(merged df)