2016-11-06 3 views
1

別のデータフレームの2つの固有の値に基づいて新しいデータフレームを作成したいと思います。2つの変数の一意の値に基づいてデータフレームを作成するR

id <- c("A", "B", "B", "C") 
st.name <- c("TX", "TX", "CA", "CA") 
type <- c(21, 26, 29, 24) 
DF <- data.frame(id, st.name, type) 
print(DF) 

id st.name type 
A  TX 21 
B  TX 26 
B  CA 29 
C  CA 24 

idとst.typeの一意の値に基づいて新しいデータフレームを作成したいと思います。結果は次のようになります。

new_id <- c("ATX", "ACA", "BTX", "BCA", "CTX", "CCA") 
new_type <- c(21, NA, 26, 29, NA, 24) 
DF2 <- data.frame(new_id, new_type) 
print(DF2) 

new_id new_type 
ATX  21 
ACA  NA 
BTX  26 
BCA  29 
CTX  NA 
CCA  24 

私は、以前のプロジェクトでdcastを使用しているが、私はここの機能を組み込む方法を確認していません。

+0

アメージング! @akrunありがとう – KMR

答えて

4

我々はtidyr

library(tidyr) 
complete(DF, id, st.name) %>% 
       unite(new_id, id, st.name, sep = '') 

またはbase Rを使用してからcompleteuniteでこれを行うことができ、我々はexpand.gridmergepaste

transform(merge(expand.grid(lapply(DF[1:2], unique)), 
      DF, all.x=TRUE), id = paste0(id, st.name))[-2] 

と予想される出力を得ることができます0

または(コメントで@Frankが言及した)CJdata.tableオプション

library(data.table) 
setDT(DF)[CJ(id = id, st.name = st.name, unique=TRUE), on=.(id, st.name)] 
+1

美しい。小さなノート: 'unite'は' sep'引数をとるので、 'unite(new_id、id、st.name、sep = '')'はOPの(更新された)例のようにセパレータを与えません。または私たちが着陸する「セプ」は何でも。 –

+1

@ tad-dallasありがとうございます – KMR

+1

あなたのマージのためのdata.tableアナログは 'setDT(DF)[CJ(id = id、st.name = st.name、unique = TRUE)、on =。 id、st.name)] ' – Frank

関連する問題