11

この質問はこの質問に関連していますが、2のdata.frame列の一意の組み合わせを使用してインデックスを作成したいと思います。したがって、私のデータ構造は、たとえば次のようになります(dput):

structure(list(avg = c(0.246985988921473, 0.481522354272779, 
0.575400762275067, 0.14651009243539, 0.489308880181752, 0.523678968337178
), i_ID = c("H", "H", "C", "C", "H", "S"), j_ID = c("P", "P", 
"P", "P", "P", "P")), .Names = c("avg", "i_ID", "j_ID"), row.names = 7:12, class = "data.frame")

したがって、上記の構造に対して作成されたインデックスは次のようになります。

1
1
2
2
1
3

サンプルデータでは、列j_IDの値は常にPですが、常にそうであるとは限りません。さらに、その逆(SPまたはPS)の組み合わせでも、同じインデックスになるはずです。

誰かがそれを達成するための良い方法を知っていますか?多くのforループとif-elseコマンドでそれを行うことができますが、それは本当にエレガントではありません。

4

2 に答える 2

6

このinteraction関数はうまく機能します:

foo = structure(list(avg = c(0.246985988921473, 0.481522354272779, 0.575400762275067, 0.14651009243539, 0.489308880181752, 0.523678968337178), i_ID = c("H", "H", "C", "C", "H", "S"), j_ID = c("P", "P", "P", "P", "P", "P")), .Names = c("avg", "i_ID", "j_ID"), row.names = 7:12, class = "data.frame")

foo$idx <- as.integer(interaction(foo$i_ID, foo$j_ID))

> foo
         avg i_ID j_ID idx
7  0.2469860    H    P   2
8  0.4815224    H    P   2
9  0.5754008    C    P   1
10 0.1465101    C    P   1
11 0.4893089    H    P   2
12 0.5236790    S    P   3

ああ、私は十分に注意深く読んでいませんでした。おそらくもっと洗練された解決策がありますが、outer関数と上三角と下三角を使用できます。

# lets assign some test values
x <- c('a', 'b', 'c') 
foo$idx <- c('a b', 'b a', 'b c', 'c b', 'a a', 'b a') 

mat <- outer(x, x, FUN = 'paste') # gives all possible combinations
uppr_ok <- mat[upper.tri(mat, diag=TRUE)]
mat_ok <- mat
mat_ok[lower.tri(mat)] <- mat[upper.tri(mat)]

mat次に、で見つかったインデックスをmat_ok:で見つかったインデックスと一致させることができます。

foo$idx <- mat_ok[match(foo$idx, mat)]
于 2013-02-26T20:26:02.440 に答える
1

ジャスティンの答えに追加するために、インデックスに元のの順序を保持させたい場合は、結果を変数に割り当ててからi_ID、を割り当てることができます。interaction()orderlevels

x <- interaction(foo$i_ID, foo$j_ID) 
x <- factor(x, levels=levels(x)[order(unique(foo$i_ID))])

foo$idx <- as.integer(x)

これは次のようになります。

> foo
         avg i_ID j_ID idx
7  0.2469860    H    P   1
8  0.4815224    H    P   1
9  0.5754008    C    P   2
10 0.1465101    C    P   2
11 0.4893089    H    P   1
12 0.5236790    S    P   3
于 2013-02-26T20:46:40.773 に答える