矩阵中有两列(v5 & v6
(,其中两列都有位于0
和5
之间的条目作为
head(matrix)
v1 v2 ... v5 v6
[1,] 0 5
[2,] 1 3
[3,] 2 1
[4,] 4 1
[5,] 2 2
我想构造一个新的(6*6(矩阵,它包含两列中每对值的出现次数作为
new_matrix
0 1 2 3 4 5
0 2326 2882 2587 734 341 0
1 50 17 103 14 0 6
2 ......
3 .......
4 ......
5 .......
我的意思是,我想知道两列中有多少对(0,0) , (0,1), ..., (0,5),... (5,5)
?
我用library(plyr)
作为
freq <- ddply(matrix, .(matrix$v5, matrix$v6), nrow)
names(freq) <- c("v5", "v6", "Freq")
但这不会产生所需的结果!
使用tidyverse
,您可以使用常见的group_by
操作来获得此答案。
示例数据
我正在创建列名,以便更容易地转换为tibble
。
set.seed(123)
M <- matrix(sample(0:5, 100, TRUE),
sample(0:5, 100, TRUE),
ncol = 2,
nrow = 100,
dimnames = list(NULL, c("colA", "colB")))
解决方案
library("tidyverse")
as_tibble(M) %>%
arrange(colA, colB) %>%
group_by(colA, colB) %>%
summarise(num_pairs = n(), .groups = "drop") %>%
pivot_wider(names_from = colB, values_from = num_pairs) %>%
remove_rownames()
预览
# A tibble: 6 x 7
colA `0` `1` `2` `4` `5` `3`
<int> <int> <int> <int> <int> <int> <int>
1 0 4 4 4 2 4 NA
2 1 2 2 4 6 2 NA
3 2 6 4 NA 2 6 NA
4 3 2 NA NA 4 6 2
5 4 NA 2 6 NA 2 4
6 5 6 2 4 4 2 2
评论
你问过:
我的意思是,我想知道有多少对(0,0(,(0,1(。。。,(0.5(,。。。(5,5(在两列中?
这个答案告诉你,问题是将结果存储为矩阵对你来说有多重要?您可以使用as.matrix
将结果进一步转换为矩阵。很可能,我会在summarise(num_pairs = n(), .groups = "drop")
之后停止,因为这会给出非常有用的结果,很容易进行子集连接等等。
我们也可以使用table
table(as.data.frame(M))
-输出
# colB
#colA 0 1 2 3 4 5
# 0 4 4 4 0 2 4
# 1 2 2 4 0 6 2
# 2 6 4 0 0 2 6
# 3 2 0 0 2 4 6
# 4 0 2 6 4 0 2
# 5 6 2 4 2 4 2