【问题标题】:Delete columns where the minor factors occur only in frequency one or two删除次要因素仅出现在频率一或二的列
【发布时间】:2025-12-06 23:15:02
【问题描述】:

我有以下矩阵,每列中有不同的字符串。一列中不同字符串的最小数量是 2。有些列最多有 20 个不同的字符串,有些列只有两个不同的字符串。我想删除次要因素仅以​​非常低的频率(

我的示例矩阵是:

n.mat <- structure(c("M", "M", "M", "M", "M", "Y", "Y", "Y", "M", "Y", 
"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", "A", "B", "C", "C", "C", "D", "D", "E", "E", "F", "G"), .Dim = c(8L, 
6L), .Dimnames = list(c("r1", "r2", "r3", "r4", "r5", "r6", "r7", 
"r8"), NULL))

想要的输出:

structure(c("M", "M", "M", "M", "M", "Y", "Y", "Y", "M", "Y", 
"Y", "Y", "F", "F", "F", "F"), .Dim = c(8L, 2L), .Dimnames = list(
    c("r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8"), NULL))

   [,1] [,2]
r1 "M"  "M" 
r2 "M"  "Y" 
r3 "M"  "Y" 
r4 "M"  "Y" 
r5 "M"  "F" 
r6 "Y"  "F" 
r7 "Y"  "F" 
r8 "Y"  "F" 

所以我想删除第 3、4、5 和 6 列,因为所有不是主要因素的因素都出现在频率 1 或 2 中。

目前我有这个:

my_fun2 <- function(x) {
  vec <- factor(x, levels = unique(x))
  lapply(vec, 
         function(y) ifelse(y, 
                     
}

n.mat[] <- n.mat[, apply(n.mat, 2, my_fun2]

【问题讨论】:

  • 是的,你的权利,对不起,我会编辑它。

标签: r matrix


【解决方案1】:

您可以在矩阵上使用列式apply

在每个步骤中,计算不同的字母(使用table),将得到的数字从高到低排序(使用sort)并检查第二个条目是否小于2。

n.mat[, apply(n.mat, 2, function(x) sort(table(x), decreasing = TRUE)[2] >= 3)]

   [,1] [,2]
r1 "M"  "M" 
r2 "M"  "Y" 
r3 "M"  "Y" 
r4 "M"  "Y" 
r5 "M"  "F" 
r6 "Y"  "F" 
r7 "Y"  "F" 
r8 "Y"  "F" 

【讨论】:

    最近更新 更多