2017-08-29 14 views
2
A <- data.frame(Item_A = c("00EF", "00EF", "00EF", "00EF", "00EF", "00FR", "00FR"), 
       Item_B = c(NA, NA, NA, NA, "JAMES RIVER", NA, NA)) 

B <- data.frame(Item_A = c("00EF", "00EF", "00EF", "00FR", "00FR"), 
       Item_B = c("JAMES RIVER", NA, "JAMES RIVER", 
          "RICE MIDSTREAM", "RICE MIDSTREAM")) 

は:他のデータを使用して欠損値を入力しますか?期待

A <- data.frame(Item_A = c("00EF", "00EF", "00EF", "00EF", "00EF", "00FR", "00FR"), 
       Item_B = c("JAMES RIVER", "JAMES RIVER", "JAMES RIVER", 
         "JAMES RIVER", "JAMES RIVER", "RICE MIDSTREAM", "RICE MIDSTREAM")) 

B <- data.frame(Item_A = c("00EF", "00EF", "00EF", "00FR", "00FR"), 
       Item_B = c("JAMES RIVER", "JAMES RIVER", "JAMES RIVER", 
          "RICE MIDSTREAM", "RICE MIDSTREAM")) 

私はItem_Aが同じである他の行のItem_Bに応じて項目Item_Bに記入しなければなりません。例えば、データセットAItem_Bの第1から第4の観察は「ジェームスリバー」になる必要があります。

Rの欠損値を記入する方法をお勧めしますか?私は多くのテクニックを試しましたが、私が望むものを得ることができません

+0

'動物園:: na.locf(A $ Item_B、fromLast = TRUE) '? – Jaap

+0

期待される出力を追加してください。 – Sotos

+0

ok、感謝のためにありがとう – YXCHEN

答えて

3

を試みることができます。

library(data.table) 
# create mapping table from both data.frames 
map <- unique(rbindlist(list(A, B)))[!is.na(Item_B)] 
# or, in case there are additional columns besides Item_A and Item_B 
map <- unique(rbindlist(list(A, B))[!is.na(Item_B), .(Item_A, Item_B)]) 
map 
Item_A   Item_B 
1: 00FF JAMES RIVER 
2: 00EF JAMES RIVER 
3: 00FR RICE MIDSTREAM 
# join and replace 
setDT(A)[map, on = c("Item_A"), Item_B := i.Item_B][] 
Item_A   Item_B 
1: 00FF JAMES RIVER 
2: 00FF JAMES RIVER 
3: 00FF JAMES RIVER 
4: 00FF JAMES RIVER 
5: 00FF JAMES RIVER 
6: 00FR RICE MIDSTREAM 
7: 00FR RICE MIDSTREAM 
setDT(B)[map, on = c("Item_A"), Item_B := i.Item_B][] 
:私は、これはルックアップまたはマッピングテーブルの助けを借りて Item_Aに属し Item_Bの値を入力する必要が信じています
Item_A   Item_B 
1: 00EF JAMES RIVER 
2: 00EF JAMES RIVER 
3: 00EF JAMES RIVER 
4: 00FR RICE MIDSTREAM 
5: 00FR RICE MIDSTREAM 

参加中、Item_Bという名前の2つの列、第一データテーブルから1、A(又はB、RESP。)及び第二のデータテーブルmapから他があります。それらを区別するために、接頭語i.は、i.Item_Bmapから取られるべきであることを示します。

+0

申し訳ありません、あなたのコードではうまくいかないのですが? – YXCHEN

+0

こんにちはUwe、私はあなたのコードが好きです。しかし、私はあなたのコードを試して、NAsはまだA&Bのデータセットで同じです。あなたが書いたように、期待しているコードを置くことはできません。 – YXCHEN

+0

@YXCHENもう一度やり直してください。コードを修正しました。どうやら、私はあまりにもポストする前にコードを磨くために熱心されています。 – Uwe

1

あなたがこれは単に各data.frameの1列に欠損値を埋めるには、単に運動ではないで、私の知る限りは質問を理解しているようtidyrライブラリヘルパーfill

library(tidyr) 
A %>% 
    tidyr::fill(Item_B, .direction = "down") %>% 
    tidyr::fill(Item_B, .direction = "up") 

    Item_A  Item_B 
1 00FF JAMES RIVER 
2 00FF JAMES RIVER 
3 00FF JAMES RIVER 
4 00FF JAMES RIVER 
5 00FF JAMES RIVER 
6 00FR JAMES RIVER 
7 00FR JAMES RIVER 
+2

こんにちはcephalopod、ありがとう。しかし、 "00FR" = "" RICE MIDSTREAM "" JAMES RIVER " – YXCHEN

2

dictionnaryデータフレームを作成しようとする可能性があります。

library(dplyr) 
dictionnary <- bind_rows(A,B) %>% 
      filter(!is.na(Item_B)) %>% 
      distinct 
find_name <- function(id){ 
    name <- dictionnary[["Item_B"]][which(dictionnary[["Item_A"]]==id)] 
    return(name) 
} 
test_id <- c("00EF","00EF","00EF","00FR","00FR") 
new_names <- sapply(test_id ,find_name) 

あなたは、あなたのデータフレーム宣言することができます:あなたの入力に基づいて

New_A <- data.frame(Item_A=c("00FF","00FF","00FF","00FF","00FF","00FR","00FR"), 
       Item_B=sapply(c("00FF","00FF","00FF","00FF","00FF","00FR","00FR"),find_name)) 

New_B <- data.frame(Item_A=c("00EF","00EF","00EF","00FR","00FR"), 
       Item_B=sapply(c("00EF","00EF","00EF","00FR","00FR"),find_name)) 
+0

こんにちはバーカーラ、ありがとう。しかし、私はコードを使用しました。エラーです。 lapplyのエラー(X = X、FUN = FUN、...):オブジェクト 'new_names'が見つかりません – YXCHEN

+0

ありがとう、私は問題を解決しました;) –

+0

あなたの助けをありがとう – YXCHEN

0

@YXCHEN更新を

lookup_df <- unique(rbindlist(list(A, B)))[!is.na(Item_B)] 

left_join(A %>% select(Item_A), lookup_df) 
left_join(B %>% select(Item_A), lookup_df) 
+0

こんにちはcephalopod、ありがとう。あなたは私よりもコードが上手です。 – YXCHEN

+0

しかし、私はたくさんの異なる "x"を扱いたいと思っています.... – YXCHEN

+1

@cephalopodあなたの答えは、パッケージを言及せずに 'data.table'と' dplyr'の関数を混合しています。 – Uwe

関連する問題