我想通过列找到矩阵的频率。例如,对于下面的矩阵x
x <- matrix(c(rep(1:4,3),rep(2:5,2)),4,5)
x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 1 2 2
[2,] 2 2 2 3 3
[3,] 3 3 3 4 4
[4,] 4 4 4 5 5
现在如何找到每个唯一列的频率并创建一个矩阵,每个列都是x的唯一列,最后一行作为矩阵x的频率添加
#freqmatrix
[,1] [,2]
[,1] 1 2
[,2] 2 3
[,3] 3 4
[,4] 4 5
[,5] 3 2
答案 0 :(得分:5)
这是一个避免将矩阵转换为列表列表的解决方案,但它也有点混乱:
x.unique <- unique(x, MARGIN = 2)
freq <- apply(x.unique, MARGIN = 2,
function(b) sum(apply(x, MARGIN = 2, function(a) all(a == b)))
)
rbind(x.unique, freq)
[,1] [,2]
1 2
2 3
3 4
4 5
freq 3 2
答案 1 :(得分:2)
这个答案会有点乱,因为它涉及到我无法避免的列表清单:
x <- matrix(c(rep(1:4,3),rep(2:5,2)),4,5)
#convert columns to elements in list
y <- apply(x, 2, list)
#Get unique columns
unique_y <- unique(unlist(y, recursive=FALSE))
#Get column frequencies
frequencies <- sapply(unique(y), function(f) sum(unlist(y, recursive=FALSE) %in% f))
#Bind unique columns with frequencies
rbind(simplify2array(unique_y), frequencies)
看哪:
[,1] [,2]
1 2
2 3
3 4
4 5
frequencies 3 2
答案 2 :(得分:2)
使用aggregate
的一个班轮(如果您的输入是data.frame
):
y <- matrix(c(1:4, 2:5, 1:4, 1,3,4,5, 2:5), ncol=5)
> y
# [,1] [,2] [,3] [,4] [,5]
# [1,] 1 2 1 1 2
# [2,] 2 3 2 3 3
# [3,] 3 4 3 4 4
# [4,] 4 5 4 5 5
z <- as.data.frame(t(y))
> t(aggregate(z, by=z, length)[1:(ncol(z)+1)])
# [,1] [,2] [,3]
# V1 1 1 2
# V2 2 3 3
# V3 3 4 4
# V4 4 5 5
# V1.1 2 1 2
注意:如果输入矩阵x
中的列数大于其值,即ncol(x) >> nrow(x)
,此解决方案将会很快。
答案 3 :(得分:2)
你最终的目标是什么?换句话说,您将如何进一步处理这些数据?如果它只是制表,那么paste()
不会让你得到答案吗?
x <- matrix(c(rep(1:4,3),rep(2:5,2)),4,5)
x1 <- data.frame(table(apply(x, 2, paste, collapse = ", ")))
# Var1 Freq
# 1 1, 2, 3, 4 3
# 2 2, 3, 4, 5 2
如果您希望将Var1
分开,则可以在该列上使用read.csv()
。
cbind(read.csv(text = as.character(x1$Var1), header = FALSE), x1[-1])
# V1 V2 V3 V4 Freq
# 1 1 2 3 4 3
# 2 2 3 4 5 2
或者,如果您希望转置输出:
t(cbind(read.csv(text = as.character(x1$Var1), header = FALSE), x1[-1]))
# [,1] [,2]
# V1 1 2
# V2 2 3
# V3 3 4
# V4 4 5
# Freq 3 2