我在每列中都有以下具有不同字符串的矩阵。一列中不同字符串的最小数量为2,有些列最多包含20个不同的字符串,有些列只有两个不同的字符串。我想将<=2
每一列中以频率1或2()出现的字符串转换为频率更高(>2
)的字符串。因此,在一个因素仅发生一次或两次的色谱柱中,应将其转换为同一色谱柱中频率更高的因素。如果下一个较高的频率(>2
)出现两次,则只需取其中一个,哪一个都不重要。保留所有其他列不变。在每一列中,总有一个频率因子大于2。
我的示例矩阵是:
n.mat <- structure(c("M", "M", "M", "M", "M", "M", "Y", "Y", "M", "M",
"Y", "Y", "F", "F", "F", "F", "M", "M", "X", "Y", "Y", "F", "F",
"F", "A", "A", "A", "A", "A", "A", "A", "B", "A", "A", "A", "A",
"A", "B", "B", "B", "C", "D", "D", "D", "E", "E", "E", "G"), .Dim = c(8L,
6L), .Dimnames = list(c("r1", "r2", "r3", "r4", "r5", "r6", "r7",
"r8"), NULL))
[,1] [,2] [,3] [,4] [,5] [,6]
r1 "M" "M" "M" "A" "A" "C"
r2 "M" "M" "M" "A" "A" "D"
r3 "M" "Y" "X" "A" "A" "D"
r4 "M" "Y" "Y" "A" "A" "D"
r5 "M" "F" "Y" "A" "A" "E"
r6 "M" "F" "F" "A" "B" "E"
r7 "Y" "F" "F" "A" "B" "E"
r8 "Y" "F" "F" "B" "B" "G"
所需的输出:
n.mat <- structure(c("M", "M", "M", "M", "M", "M", "M", "M", "F", "F",
"F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F",
"F", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A",
"A", "B", "B", "B", "D", "D", "D", "D", "E", "E", "E", "D"), .Dim = c(8L,
6L), .Dimnames = list(c("r1", "r2", "r3", "r4", "r5", "r6", "r7",
"r8"), NULL))
[,1] [,2] [,3] [,4] [,5] [,6]
r1 "M" "F" "F" "A" "A" "D"
r2 "M" "F" "F" "A" "A" "D"
r3 "M" "F" "F" "A" "A" "D"
r4 "M" "F" "F" "A" "A" "D"
r5 "M" "F" "F" "A" "A" "E"
r6 "M" "F" "F" "A" "B" "E"
r7 "M" "F" "F" "A" "B" "E"
r8 "M" "F" "F" "A" "B" "D"
我可以通过此代码计算每一列中每个因子的频率,但是仍然缺少将字符串转换为频率更高的字符串的部分:
n.mat<-n.mat[, apply(n.mat, 2, function(x) sort(table(x), decreasing = TRUE)]
尝试这个。
apply(n.mat, 2, function(x) {
tx <- sort(table(x), decreasing=TRUE)
x[x %in% names(tx[tx <=2])] <- names(rev(tx[names(tx[tx > 2])])[1])
x
})
# [,1] [,2] [,3] [,4] [,5] [,6]
# r1 "M" "F" "F" "A" "A" "E"
# r2 "M" "F" "F" "A" "A" "D"
# r3 "M" "F" "F" "A" "A" "D"
# r4 "M" "F" "F" "A" "A" "D"
# r5 "M" "F" "F" "A" "A" "E"
# r6 "M" "F" "F" "A" "B" "E"
# r7 "M" "F" "F" "A" "B" "E"
# r8 "M" "F" "F" "A" "B" "E"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句