2016-04-03 2 views
1

これに似た質問をたくさん読んだことがありますが、私はこれが冗長で、私はそれを見ることができない場合は謝罪します。別の2つのid変数からのデータで1つのデータフレーム内のNAsを入力してください

私はプライマリデータセットとバックアップデータセットを持っています。プライマリにNAが設定されている場合、バックアップを調べたいと思います。full.place.nameとYearに一致する値があれば、NAをその値に置き換えます。

primary

Year Firearm.Homicide Firearm.Suicide Firearm.Unintentional full.place.name 
2010    0   <NA>      0 Adair County, KY 
2010    10    19     <NA> Adams County, CO 

backupである私が欲しいもの

Year Firearm.Homicide Firearm.Suicide Firearm.Unintentional full.place.name 
2010    NA    1      1 Adair County, KY 
2010    NA    NA      0 Adams County, CO 

である私は

library(data.table) 
setDT(primary); setDT(backup) 
primary[is.na(primary$Firearm.Homicide), primary$Firearm.Homicide := backup[backup, primary$Firearm.Homicide, on=c("Year", "full.place.name")]] 
を試してみた

Year Firearm.Homicide Firearm.Suicide Firearm.Unintentional full.place.name 
2010    0    1      0 Adair County, KY 
2010    10    19      0 Adams County, CO 

です

しかし、最後に5列が追加され、値が正しく取得されませんでした。私もifelseステートメントとFillInを試してきました。 5行のデータがあります:

primary<-structure(list(Year = c(2010, 2010, 2010, 2010, 2010), 
       Firearm.Homicide = c("0","10", "4", "3", NA), Firearm.Suicide = c(NA,"19", "5", "6", 
       NA), Firearm.Unintentional = c("0", NA, NA, "0", "0"), full.place.name = c("Adair County, KY", 
       "Adams County, CO", "Adams County, MS", "Adams County, PA", "Adams County, WI" 
      )), .Names = c("Year", "Firearm.Homicide", "Firearm.Suicide", 
       "Firearm.Unintentional", "full.place.name"), row.names = c(NA, 
       5L), class = "data.frame") 

backup<-structure(list(Year = c(2010, 2010, 2010, 2010, 2010), Firearm.Homicide = c(NA, 
      NA, 4, 3, 3), Firearm.Suicide = c(1, NA, NA, NA, NA), Firearm.Unintentional = c(1, 
      0, 1, NA, NA), full.place.name = c("Adair County, KY", "Adams County, CO", 
      "Adams County, MS", "Adams County, PA", "Adams County, WI")), .Names = c("Year", 
      "Firearm.Homicide", "Firearm.Suicide", "Firearm.Unintentional", 
      "full.place.name"), row.names = c(NA, 5L), class = "data.frame") 

本当に助けていただきありがとうございます。

答えて

2

2つのデータフレームが常に指定されたものと同じ構造を持っている場合は、これに対する直接的な解決策があります。テーブルの要素があらかじめ相互にマップされている場合は、 primary[is.na(primary)] <- backup[is.na(primary)]のようにすることができます。あなたのキー列が「年」と「full.place.name」であると仮定して、dplyrパッケージを使用してdata.frameをソートする方法があります。

library(dplyr) primary <- arrange(primary, Year, full.place.name) %>% select(Year, Firearm.Homicide,Firearm.Suicide, Firearm.Unintentional, full.place.name) backup <- arrange(backup, Year, full.place.name) %>% select(Year, Firearm.Homicide, Firearm.Suicide, Firearm.Unintentional, full.place.name)

それはそれを行うための最適な方法ではないかもしれませんが、それは理解しやすいです。

+0

彼らは今、お互いにマップされていない、(あなたの例のように)同じですか? – user5457414

+0

両方のデータフレームをキー列で最初に並べ替えることができます。その内容は「年」と「full.place.name」であるはずです。 – Psidom

0

data.tableのオプションの1つはsetです。 「primary」の「Firearm」列はcharacterクラスで、「backup」の対応する列はnumericです。したがって、「プライマリ」の「銃器」列のNAの値を「バックアップ」の対応する値に割り当てる前に、「プライマリ」の列のclassnumericに変更する必要があります。

結合ステップの後、 "Firearm"カラムをループし、 "数値"に変換し、 "NA"を "i"カラムの対応する値に置き換え、最後にset "i"カラムNULLに設定します。

#joining step 
dt <- setDT(primary)[backup, on = c("Year", "full.place.name")] 
#identify the Firearm columns with `grep` 
nm1 <- grep("^Firearm", names(primary), value=TRUE) 
#create a corresponding "i." column names vector from nm1 
nm2 <- paste0("i.", nm1) 
#loop through the columns 
for(j in seq_along(nm1)){ 
    #convert the Firearm columns from primary to `numeric` 
    set(dt, i = NULL, j= nm1[j], value = as.numeric(dt[[nm1[j]]])) 
    #replace the NA with corresponding values from "i" columns 
    set(dt, i = which(is.na(dt[[nm1[j]]])), j = nm1[j], 
     value = dt[[nm2[j]]][is.na(dt[[nm1[j]]])]) 
    #remove the i columns by assigning it to NULL 
    set(dt, i = NULL, j= nm2[j], value = NULL) 
} 


dt 
# Year Firearm.Homicide Firearm.Suicide Firearm.Unintentional full.place.name 
#1: 2010    0    1      0 Adair County, KY 
#2: 2010    10    19      0 Adams County, CO 
#3: 2010    4    5      1 Adams County, MS 
#4: 2010    3    6      0 Adams County, PA 
#5: 2010    3    NA      0 Adams County, WI 
0

と仮定すると、あなたのデータセットが同じソートされ、すべての名前は、私はそれを行うことができる方法

primary[is.na(primary)] <- backup[is.na(primary)] 
primary 
# Year Firearm.Homicide Firearm.Suicide Firearm.Unintentional full.place.name 
#1 2010    0    1      0 Adair County, KY 
#2 2010    10    19      0 Adams County, CO 
#3 2010    4    5      1 Adams County, MS 
#4 2010    3    6      0 Adams County, PA 
#5 2010    3   <NA>      0 Adams County, WI 
関連する問題