2017-05-23 13 views
1

私は、各個人(行)が変数ごとに2つのデータポイントを持つデータフレームを持っています。変数の2列にIDを割り当てます

例データ:

df1 <- read.table(text = "IID L1.1 L1.2 L2.1 L2.2 
         1 1 38V1 38V1 48V1 52V1 
         2 2 36V1 38V2 50V1 48Y1 
         3 3 37Y1 36V1 50V2 48V1 
         4 4 38V2 36V2 52V1 50V2", 
    stringsAsFactor = FALSE, header = TRUE) 

私は完全なデータセットで、これよりもさらに多くの列を持っており、2列にわたって一意の識別子をラベル付けするために、これらの値を再コーディングしたいと思います。私は識別子を取得し、以前の質問(Creating a unique IDHow to assign a unique ID number to each group of identical values in a column)から単一列を再ラベル付けする方法を知っていますが、Rが列ごとに要素を識別してラベル付けするので、2つの列の情報を含める方法はわかりません。

最終的に私は、上記のデータのために、このようになります何かをしたい:

(df2) 
    IID L1.1 L1.2 L2.1 L2.2 
1 1 1 1 1 4 
2 2 2 4 2 5 
3 3 3 2 3 1 
4 4 1 5 4 3 

本当に限り、彼らは両方の列で一意の値を示すように、数字が何であるかは重要ではありません。私はからの出力に基づいて機能を作成しようとしました:

unique(df1[,1:2]) 

が、これはまだない2間で、列ごとに一意のエントリを見て苦労しています。

答えて

2

このような何かが働くだろう...

pairs <- (ncol(df1)-1)/2 
for(i in 1:pairs){ 
    refs <- unique(c(df1[,2*i],df1[,2*i+1])) 
    df1[,2*i] <- match(df1[,2*i],refs) 
    df1[,2*i+1] <- match(df1[,2*i+1],refs) 
} 

df1 
    IID L1.1 L1.2 L2.1 L2.2 
1 1 1 1 1 4 
2 2 2 4 2 5 
3 3 3 2 3 1 
4 4 4 5 4 3 
+1

こんにちは!私がdfを行列に変換すると、これは私のために働いた。このコードでは、NAを可能な一意の識別子の1つに変換するため、データにNAに関する問題が発生しています。どうやってそれを説明できるか知っていますか? 編集:割り当てられた番号はそれほど問題にはならないので、後でNAに切り替えてください。 ありがとうございます! –

+0

また、 'refs

2

あなたは、長い形式に再構築グループを割り当てた後、広いにそれを書き直すことができ:

library(data.table) 

df_m <- melt(df, id.vars = "IID") 
setDT(df_m)[, id := .GRP, by = .(gsub("(.*).","\\1", df_m$variable), value)] 
dcast(df_m, IID ~ variable, value.var = "id") 

# IID L1.1 L1.2 L2.1 L2.2 
#1 1 1 1 6 9 
#2 2 2 4 7 10 
#3 3 3 2 8 6 
#4 4 1 5 9 8 

これも容易に拡張する必要があります列の複数のグループに私。 L3.があれば、それも同様に動作するはずです。

関連する問題