2017-07-21 1 views
1

これは、エレガントに解決できるはずのdplyrを使用する方法をまだ考えていないか、見つけていないという問題です。dplyrを使用して名前のベクトルを新しい名前に置き換えよう

私は各IDに関連付けられた名前を持つ元のデータフレームを持っていると言います。

original_data <- data.frame(id = 1:10, name = letters[1:10], stringsAsFactors = F) 

そこから、元のデータフレーム内の名前を持つデータフレームが置き換えられます。

replacement_dataframe <- data.frame(old_name = c("a","b", "c"), 
            new_name = c("abra", "banana", "coconut"), 
            stringsAsFactors = F) 

私は通常、私はdplyr使用したいが、そのようにまだそれを考え出したていない操作を行うと、

original_data$name[original_data$name == "a"] <- "abra" 
original_data$name[original_data$name == "b"] <- "banana" 
original_data$name[original_data$name == "c"] <- "coconut" 
+4

@ycwからちょうど 'match'またはdplyr''や '' data.table' SETDT(original_data)と 'left_join'を行います[ – akrun

答えて

2

これが機能するようになりました:

ind <- match(original_data$name, replacement_dataframe$old_name) 
original_data$name[!is.na(ind)] <- replacement_dataframe$new_name[ind[!is.na(ind)]] 
+0

新しい名前の順序がその順序と揃っていないと、あなたのメソッドを動作させるにはどうすればよいですか?(名前= old_name)元のデータフレームのサンプルデータのその部分を作っていないという私のせいです。 – cylondude

+0

私は理解していない、これは動作しませんか? –

+0

です!ありがとうございました。しかし元のデータフレームの行の順序を変更した場合、original_data < - data.frame(id = 10:1、name = letters [10:1]、stringsAsFactors = F)になりません – cylondude

2

PythonRの両方で作業しているため、これをお勧めします。

map=c("a"="abra","b"="banana","c"="coconut") 

original_data$name[!is.na(map[original_data$name])]=map[original_data$name][!is.na(map[original_data$name])] 


> original_data 
    id name 
1 1 abra 
2 2 banana 
3 3 coconut 
4 4  d 
5 5  e 
6 6  f 
7 7  g 
8 8  h 
9 9  i 
10 10  j 

EDIT:@ Damianの方法、はるかに素敵です。

original_data %>% mutate(name = ifelse(name %in% names(map), map[name], name)) 

EDIT2:map作成するための

map <- replacement_dataframe$new_name 
names(map) <- replacement_dataframe$old_name 
+0

私はルックアップとして名前付きベクトルを使うのが好きです。読みやすさを向上させるため、 'original_data%>%mutate(name = ifelse(%names(map)、map [name]、name)')のサブセット化の代わりに 'ifelse'を使用して条件を実装します。また、便宜上、 'map'ベクトルをプログラムで生成することをお勧めします。' map < - replacement_dataframe $ new_name'の後に 'names(map)< - replacement_dataframe $ old_name'を付けます。 – Damian

+0

良いアプローチ。手動で 'a =" abra "、...'をタイプして 'map'を作成したくない場合は、' map < - replacement_dataframe $ new_name 'を使い、 'names(map)< - replacement_dataframe $ old_name ' – www

+0

@ycwありがとう〜それはたくさんの助けになる' – Wen

関連する問題