2016-08-26 12 views
1

データフレームAは、B(これもNAという観測値は除外されています)のように見せかけるのではなく、賢明な方法です。これは "溶融"機能で達成できますか?Rの列方向ではなく、列方向に「溶融」する方法は?

A <- read.table(text=" Id1 Id2 Var1 Var2 Var3  
      1 1 1 2 NA 
      1 2 NA 3 4 
      1 3 5 6 7 ", header=T) 


B <- read.table(text=" Id1 Id2 NewVar 
    1 1 1 
    1 1 2 
    1 2 3 
    1 2 4 
    1 3 5 
    1 3 6 
    1 3 7 ", header=T) 

私は同様の質問にanswerを見つけましたが、機能は行き過ぎのように思えるし、私の現在のRのスキルを超えています。

答えて

3

我々はINGのmelt後にorderできるの転置と

library(data.table) 
melt(setDT(A), id.var = c("Id1", "Id2"), na.rm = TRUE, value.name = "NewVar" 
    )[order(Id1, Id2)][, variable := NULL][] 
# Id1 Id2 NewVar 
#1: 1 1  1 
#2: 1 1  2 
#3: 1 2  3 
#4: 1 2  4 
#5: 1 3  5 
#6: 1 3  6 
#7: 1 3  7 

それとも「ID」の列に「A」の行の拡大に複製することによりbase Rで行うことができ、かつcbind非Id列が連結されます。

`row.names<-`(na.omit(data.frame(A[rep(1:nrow(A), each =3), 1:2], 
        NewVar= c(t(A[-(1:2)])))), NULL) 
# Id1 Id2 NewVar 
#1 1 1  1 
#2 1 1  2 
#3 1 2  3 
#4 1 2  4 
#5 1 3  5 
#6 1 3  6 
#7 1 3  7 
+1

私は理解していませんが、この質問はマイナーフォーマットの基本的な形を変えたものではありませんか? 'reshape(A、dir = 'long'、varying = 3:5、sep = '')' – rawr

5

tidyverseから、溶融 - > [集計 - >アンネスト

library(reshape2) 
library(tidyr) 
melt(A, id=c("Id1", "Id2")) %>% group_by(Id1, Id2) %>% 
    summarise(value=list(value[!is.na(value)])) %>% unnest() 
# Source: local data frame [7 x 3] 
# Groups: Id1 [1] 
# 
#  Id1 Id2 value 
# <int> <int> <int> 
# 1  1  1  1 
# 2  1  1  2 
# 3  1  2  3 
# 4  1  2  4 
# 5  1  3  5 
# 6  1  3  6 
# 7  1  3  7 

編集

meltNA除去引数(クレジット:@Frank)持っているので、ワンライナーをしましょう。注意:

melt(A, id=c("Id1", "Id2"), na.rm=TRUE)[-3] 
2

あなたはtidyrパッケージからgatherdplyrを使用することができます:

library(dplyr) 
library(tidyr) 
A %>% gather(Key,NewVar,Var1:Var3) %>% 
     filter(!is.na(NewVar)) %>% 
     arrange(Id1,Id2) %>% select(-Key) 
## Id1 Id2 NewVar 
##1 1 1  1 
##2 1 1  2 
##3 1 2  3 
##4 1 2  4 
##5 1 3  5 
##6 1 3  6 
##7 1 3  7 

これは、内の行に列Var1:Var3を収集します。この行はakrunのdata.tableアプローチのreshape2バージョンですNewVarカラム。 Key列には、最終結果では必要ない、収集された列の名前が含まれます。集めた後、のNA行のうちNewVarの行。その後、ID1でソートし、続いてID2をソートし、Key列を削除します。

関連する問題