0

私はRとプログラミング全般に不慣れです。私はこのデータを持っています:スクリーンショット ここに画像の説明を入力

私は 12 の「ID」(研究対象) を持っており、1 から 12 までの番号が付けられています。「タイプ」列は、各 ID の「タイプ」を示します。たとえば、「タイプ」列の最初の 5 つの数字は、最初の 5 つの ID の「タイプ」を参照します。つまり、最初の 5 つの ID の「タイプ」は、それぞれ 3、3、2、1、1 です。

「ペア」列は、ID がどのようにペアにされているかを示します。たとえば、6 は 9 と対になっています。4 は 7 とペアになっています。1 は 11 などとペアになっています。

そこで、このデータを使用して 3 つの列を作成したいと考えています。

最初の列: ID (1-12) をリストします
2 番目の列:ペアの ID を返します(1 は 11 とペアになっているように、2 番目の列は ID 1 に対して 11 と表示する必要があります)
3 番目の列:ペアの「タイプ」を示します (したがって、11 の「タイプ」は 3 です。3 番目の列にはそれが表示されます。

目的の出力形式を視覚化したものを次に示します: output format ここに画像の説明を入力

どんな助けでも大歓迎です。前もって感謝します!

4

1 に答える 1

1

これは、巧妙な索引付けで行うことができます。タイプのベクトルとして生データを入力し、ペアのベクトルのリストを入力しました。

# Enter the raw data
type <- c(3, 3, 2, 1, 1, 1, 2, 3, 1, 1, 3, 1)
pairs <- list(c(6, 9), c(4, 7), c(1, 11), c(3, 10), c(2, 12), c(5, 8))

これから、すべてのペアを元の順序で一度スタックし、次に逆の順序でスタックすることにより、目的の出力の最初の 2 つの列を作成できます。(リスト内の各ペアにコマンドをlapply(pairs, rev)適用するを使用して、各ペアを逆にしました。)rev

# Create a 12 x 2 matrix of the pairs
pairs.mat <- do.call(rbind, c(pairs, lapply(pairs, rev)))
pairs.mat
#       [,1] [,2]
#  [1,]    6    9
#  [2,]    4    7
#  [3,]    1   11
#  [4,]    3   10
#  [5,]    2   12
#  [6,]    5    8
#  [7,]    9    6
#  [8,]    7    4
#  [9,]   11    1
# [10,]   10    3
# [11,]   12    2
# [12,]    8    5

結果をきれいにするために、これを次のように変換しましたdata.frame

# Convert to data frame
colnames(pairs.mat) <- c("id", "match")
df <- as.data.frame(pairs.mat)

data.frame最後に、先ほど作成した から一致列の順序で型を取得することにより、type_match 列を取得できます。

# Add in the type_match column
df$type_match <- type[df$match]

# Print results in order
df[order(df$id), ]
#    id match type_match
# 3   1    11          3
# 5   2    12          1
# 4   3    10          1
# 2   4     7          2
# 6   5     8          3
# 1   6     9          1
# 8   7     4          1
# 12  8     5          1
# 7   9     6          1
# 10 10     3          2
# 9  11     1          3
# 11 12     2          3

そして、それはあなたに望ましい出力を与えるはずです。

于 2016-04-23T01:27:48.683 に答える