删除包含两个字符串和一个在R中出现一次或两次的因子的列

删除包含两个字符串和一个在R中出现一次或两次的因子的列,r,matrix,R,Matrix,我有一个数字为0和1的矩阵,每列包含相同数量的字符串。一列中的最小字符串数为2。我想删除同时满足这两个条件的列 仅包含两个字符串(10和01) 如果01只出现一两次。 但我想让所有其他专栏保持原样: r1您可以添加&以将逻辑选择与“和”逻辑相结合。虽然在这种情况下,我认为您希望删除这些值,而不是保留它们,所以您需要否定最终选择: n.mat[, apply(n.mat, 2, FUN=function(x) !(length(unique(x)) == 2 & sum(x == '01'

我有一个数字为0和1的矩阵,每列包含相同数量的字符串。一列中的最小字符串数为2。我想删除同时满足这两个条件的列

  • 仅包含两个字符串(
    10
    01
  • 如果
    01
    只出现一两次。 但我想让所有其他专栏保持原样:

  • r1您可以添加
    &
    以将逻辑选择与“和”逻辑相结合。虽然在这种情况下,我认为您希望删除这些值,而不是保留它们,所以您需要否定
    最终选择:

    n.mat[, apply(n.mat, 2, FUN=function(x) !(length(unique(x)) == 2 & sum(x == '01') <= 2))]
    
    所有给予:

    #   [,1] [,2]  [,3]   [,4] 
    #r1 "10" "001" "0001" "100"
    #r2 "01" "001" "0001" "100"
    #r3 "10" "100" "1000" "010"
    #r4 "10" "010" "0100" "001"
    #r5 "01" "010" "0010" "001"
    #r6 "01" "010" "0010" "001"
    
    使用列和也可能有一些棘手的方法,如果您有大量数据,例如:

    n.mat[, !(
     (colSums(n.mat == "01") <= 2) &
     colSums(matrix(n.mat %in% c("10","01"), nrow=nrow(n.mat), ncol=ncol(n.mat))) == nrow(n.mat)
    )]
    
    n.mat[(
    
    (colSums(n.mat==“01”)是第一个标准,因为只有两个不同的字符串,但在我的矩阵中只有“10”和“01”。因此这两个都是正确的。
    n.mat[, apply(n.mat, 2, FUN=function(x) !(length(unique(x)) == 2 & sum(x == '01') <= 2))]
    
    n.mat[, !apply(n.mat, 2, FUN=function(x) length(unique(x)) == 2 & sum(x == '01') <= 2)]
    
    n.mat[, apply(n.mat, 2, FUN=function(x) length(unique(x)) != 2 | sum(x == '01') > 2)]
    
    #   [,1] [,2]  [,3]   [,4] 
    #r1 "10" "001" "0001" "100"
    #r2 "01" "001" "0001" "100"
    #r3 "10" "100" "1000" "010"
    #r4 "10" "010" "0100" "001"
    #r5 "01" "010" "0010" "001"
    #r6 "01" "010" "0010" "001"
    
    n.mat[, !(
     (colSums(n.mat == "01") <= 2) &
     colSums(matrix(n.mat %in% c("10","01"), nrow=nrow(n.mat), ncol=ncol(n.mat))) == nrow(n.mat)
    )]