2017-10-24 22 views
1

一切のNAがないところだけ変数を含める:2つのデータフレームをマージするが、私はマージしたい、私は2つのデータフレームを持って

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 

私は会社によって2つのデータフレームをマージしたいですが、私はその代わりにNAを持たない企業を含めるだけです。新しいデータフレームは、したがって、次のようになります。

df3:GOODTECHはdf2に戻り、LABOREMUSでのNA含まれていないたため、

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は、含まれています。

私はdf3 <- merge(df2, df1[!is.na(df1$Return)], by = "Company")を試してみましたが、これは動作しません。なぜなら、企業全体ではなく、NAで行を省略しているからです。

私はこれをどのように修正することができますか?

答えて

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

試験データ:NA行がある企業をつかむためにwhich()unique()を使用して

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))                                            

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)

関連する問題