2017-12-31 201 views
1

私はRを見つめて、2つの異なるテーブルの2つの列を比較しようとします。 一致する場合は、特定の値(df1)を置き換えます。 私はデータベースにスクリプトを使いたいので、追加のパッケージを使用することについて非常に制限されているという問題もあります。フレーム/テーブルの特定の行を比較して置き換えます

DF1:

DE 
Deutschland 
England 
Germany 
Italien 

DF2

GE    EN 
Deutschland  Germany 
Italien   Italy 
England   UK 

結果: DF1:

DE 
Deutschland 
England 
**Deutschland** 
Italien 

私は次のコードを試してみました:

df1 <- data.frame("DE" = c("Deutschland", "England", "Germany", "Italien")) 
df2 <- data.frame("GE" = c("Deutschland", "Italien", "England"), "EN" = c("Germany", "Italy", "UK")) 
df1[] <- lapply(df1, as.character) 
df2[] <- lapply(df2, as.character) 

df1 <- ifelse(!(df1$DE %in% df2$EN), df1$DE, df2$GE) 

"Deutschland"の代わりに "England"を置き換えます。正しい行をどのように置き換えることができますか?

答えて

6

そのnomatch演算子はとmatchを使用して可能な解決策:与え

df1$DE[df1$DE %in% df2$EN] <- df2$GE[match(df1$DE, df2$EN, nomatch = 0)] 

> df1 
      DE 
1 Deutschland 
2  England 
3 Deutschland 
4  Italien 

を、これは何:

  • df1$DE[df1$DE %in% df2$EN]は、df1のどの行が置換を必要とするかを示します。
  • df2$GE[match(df1$DE, df2$EN, nomatch = 0)]は、置換をdf2から選択します。
  • 後者は前者に<-で割り当てることができます。

としては%in%は、ボンネットの下にmatchを使用して、the commentsに@ r2evansによって指摘しました。あなたも行うことができ、その知識に基づいて:

ind <- match(df1$DE, df2$EN, nomatch = 0) 
df1$DE[ind > 0] <- df2$GE[ind] 

インデックスindは、今一度だけ作成されているので、これは大規模なデータセットにかなりのspeadの増加につながる可能性があります。あなたはまた、アップデートでこれを行うことができ


data.tableに参加:

同じ結果与え
# load the package 
library(data.table) 

# convert the dataframes to data.table's 
setDT(df1) 
setDT(df2) 

# perform the update join 
df1[df2, on = .(DE = EN), DE := GE][] 

  DE 
1: Deutschland 
2:  England 
3: Deutschland 
4:  Italien 
%で
+2

'%が' '試合を使用します'。大規模なデータセットでは、 'df1 $ DE [ind> 0] < - df2 $ GE [ind]'の後に 'ind < - match(df1 $ DE、df2 $ EN、nomatch = 0)'を使用する方が有利かもしれません。 (この小さなデータセットでは、すでに約30%速くなっていますが、その時間差は重要ではありません) – r2evans

+0

答えと説明をありがとう。 –

+1

@ r2evans thx&added :-) – Jaap

関連する問題