2017-01-06 4 views
-2

私は以下のようなデータセットを持っています。私はそれを変換するためにRコードを書こうとしています。これは自我ネットワークです。つまり、最初の列には、接続を列挙した2人のユーザー(列A1、A2、A3にあります)があります。Rで次のデータフレームを再構成するにはどうすればよいですか?

d <- data.frame(matrix(c("Steph","Ellen","John","Jim","Sam","Tom","Sally","Jane","Sam","Jane","Sally","NA","John","Jim","NA","Jane","Sam","NA","NA","Tom"),2,10)) 
names(d)<-c("Ego","A1","A2","A3","A1Connection1","A1Connection2","A2Connection1","A2Connection2","A3Connection1","A3Connection2") 
d 

私の挑戦は10を通じてカラム2を取ると、彼らは私がドンこの

ReshapedData<-data.frame(matrix(c("John","John","Sam","Sam","Sally","Sally","Jim","Jim","Tom","Tom","Jane","Jane", 
      "Sam","Sally","John","NA","Sam","NA","Jane","NA","Jim","Jane","NA","Tom"),12,2)) 
names(ReshapedData)<-c("Alter", "Alter_Alter") 
ReshapedData 

のように見えるようにすることです」:次に列5〜10で私がA1、A2およびA3の人々との相互関係を持っています少なくともこの段階では、自我の名前が必要です。鍵は他のものを最初に得ることです。今まで私が思いつくことができる最も良いことは、各行に5〜10列を転置し、次にrbindを使用して1つの長い列を作成し、次にA1、A2、A3の変更点のリストでそれをバインドすることです。それはそれを管理するためのもっと合理化された方法でなければなりません。

おかげ

ボグダン

+2

は、画像リンクとしてデータを追加しないでください。代わりに、コードの書式設定のためにインデント付きのデータをコピー&ペーストします。 [良い例を作る方法については、このリンクを参照してください](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) –

+0

ノートをありがとう。ただ更新されました。 – Bogdan

答えて

1

共通のインデックスとreshapeパッケージと一致する項目からmelt()機能の使用:

d <- data.frame(matrix(c("Steph","Ellen","John","Jim","Sam","Tom","Sally","Jane","Sam","Jane","Sally","NA","John","Jim","NA","Jane","Sam","NA","NA","Tom"),2,10)) 
names(d)<-c("Ego","A1","A2","A3","A1Connection1","A1Connection2","A2Connection1","A2Connection2","A3Connection1","A3Connection2") 
d 

library(reshape) 

a <- melt(d,id.vars=NULL,measure.vars = c("A1","A2","A3")) 
a$match <- as.character(paste(a[,1],rep(1:2))) 
b <- melt(d,id.vars=NULL,measure.vars = c(5:dim(df)[2])) 
b$match <- as.character(paste(gsub(pattern = ".*A([0-9]+).*",replacement = "A\\1",x = b[,1]), 
           rep(1:2))) 

df.final <- data.frame(Alter=a$value[match(b$match,a$match)], Alter_Alter=b$value) 

index <- 1:dim(df.final)[1] 

index <- matrix(1:dim(df.final)[1], nrow = dim(df.final)[1]/2,byrow = T) 

df.final <- df.final[as.vector(index),] 

df.final 
    Alter Alter_Alter 
1 John   Sam 
3 John  Sally 
5 Sam  John 
7 Sam   NA 
9 Sally   Sam 
11 Sally   NA 
2 Jim  Jane 
4 Jim   NA 
6 Tom   Jim 
8 Tom  Jane 
10 Jane   NA 
12 Jane   Tom 

# Test 

ReshapedData<-data.frame(matrix(c("John","John","Sam","Sam","Sally","Sally","Jim","Jim","Tom","Tom","Jane","Jane", 
      "Sam","Sally","John","NA","Sam","NA","Jane","NA","Jim","Jane","NA","Tom"),12,2)) 
names(ReshapedData)<-c("Alter", "Alter_Alter") 

df.final==ReshapedData 

    Alter Alter_Alter 
1 TRUE  TRUE 
3 TRUE  TRUE 
5 TRUE  TRUE 
7 TRUE  TRUE 
9 TRUE  TRUE 
11 TRUE  TRUE 
2 TRUE  TRUE 
4 TRUE  TRUE 
6 TRUE  TRUE 
8 TRUE  TRUE 
10 TRUE  TRUE 
12 TRUE  TRUE 
+0

ありがとうございました。完璧! – Bogdan

+0

ようこそ。だから、私は参照してください1つの問題がある答えを受け入れる、 –

+0

してください。再構成されたデータフレームでは、列1のJohnは2つの接続SamとSallyを持つ必要があります。 df.finalでは、サムとジェーンを引っ張っているので、列5と6を横断するのではなく、列の下に行く。索引付けで簡単に修正できるのは何か? – Bogdan

関連する問題