0

我是 R 和一般编程的新手。我有这个数据:截图 在此处输入图像描述

我有 12 个“ID”(研究对象),编号为 1-12。“类型”列告诉每个 ID 的“类型”。例如,“类型”栏的前5个数字是指前5个ID的“类型”,即前5个ID的“类型”分别为3、3、2、1、1。

“pairs”列描述了 ID 如何配对在一起。例如 6 与 9 配对;4与7配对;1 与 11 配对,依此类推。

所以我需要帮助的是我想使用这些数据创建三列。

第一列:列出 ID (1-12)
第二列:返回配对的 ID 就像 1 与 11 配对,所以第二列应该说 11 表示 ID 1)
第三列:告诉配对的“类型”(所以 11 的“类型”是 3。第三列应该显示。

这是所需输出格式的可视化:输出格式 在此处输入图像描述

任何帮助将非常感激。提前致谢!

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))

由此,您可以创建所需输出的前两列,方法是将所有对按原始顺序堆叠一次,然后再按相反顺序堆叠。(我使用 反转了每一对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 回答