将数据转换为数据框
Converting data to data frame
我是 R 和一般编程的新手。我有这个数据:screenshot
我有12个'IDs'(研究对象),编号1-12。 'types' 列告诉每个 ID 的 'type'。例如'types'列的前5个数字是指前5个ID的'types',即前5个ID的'types'分别为3,3,2,1,1。
'pairs' 列描述了 ID 是如何配对在一起的。例如,6 与 9 配对; 4 与 7 配对; 1 与 11 配对,依此类推。
所以我需要帮助的是我想使用这些数据创建三列。
第一列: 列出 ID (1-12)
第二列: returns 对 的 ID(例如 1 与 11 配对,因此第二列应该为 ID 1 显示 11 )
第三列: 告诉 'type' 对(所以 'type' of 11 is 3. 第三列应该显示.
这是所需输出格式的可视化:output format
如有任何帮助,我们将不胜感激。
提前致谢!
您可以通过一些巧妙的索引来做到这一点。我将原始数据作为类型的向量和成对的向量列表输入:
# 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
这应该会给你想要的输出。
我是 R 和一般编程的新手。我有这个数据:screenshot
我有12个'IDs'(研究对象),编号1-12。 'types' 列告诉每个 ID 的 'type'。例如'types'列的前5个数字是指前5个ID的'types',即前5个ID的'types'分别为3,3,2,1,1。
'pairs' 列描述了 ID 是如何配对在一起的。例如,6 与 9 配对; 4 与 7 配对; 1 与 11 配对,依此类推。
所以我需要帮助的是我想使用这些数据创建三列。
第一列: 列出 ID (1-12)
第二列: returns 对 的 ID(例如 1 与 11 配对,因此第二列应该为 ID 1 显示 11 )
第三列: 告诉 'type' 对(所以 'type' of 11 is 3. 第三列应该显示.
这是所需输出格式的可视化:output format
如有任何帮助,我们将不胜感激。 提前致谢!
您可以通过一些巧妙的索引来做到这一点。我将原始数据作为类型的向量和成对的向量列表输入:
# 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
这应该会给你想要的输出。