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

卢克354

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

  1. 仅包含两个字符串(1001),
  2. 如果01只发生一两次。但是我想保留所有其他列:
    r1 <- c("10","001","0001","01","100","10")
    r2 <- c("01","001","0001","10","100","10")
    r3 <- c("10","100","1000","10","010","01")
    r4 <- c("10","010","0100","10","001","10")
    r5<- c("01","010","0010","10","001","10")
    r6<- c("01","010","0010","10","001","01")
    
    n.mat <- rbind(r1,r2,r3,r4,r5,r6)

输出:

    r1 <- c("10","001","0001","100")
    r2 <- c("01","001","0001","100")
    r3 <- c("10","100","1000","010")
    r4 <- c("10","010","0100","001")
    r5<- c("01","010","0010","001")
    r6<- c("01","010","0010","001")
    
    n.mat <- rbind(r1,r2,r3,r4,r5,r6)

卸下第4列和第6列。

到目前为止,我的代码是:

del_two<- function(x){
  length(unique(x)) != 2
}
msa_protein.mat_1<-msa_protein.mat[, apply(msa_protein.mat, 2, del_two)] 

但是我不确定如何添加if函数。

后期邮件

您可以添加&将逻辑选择与“ AND”逻辑结合在一起。尽管在这种情况下,我认为您想删除这些值而不是保留它们,所以您需要取消!最终选择:

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)]

您也可以将其表示为逻辑条件失败,再加上|“ OR”逻辑:

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)
)]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

一次扫描字符串中的前两个字符

Grep一个日志文件,以获取两个字符串之间最后一次出现的字符串

Ruby on Rails:高级搜索,一次搜索中包含两个字符串

如何从一个字符串中一次读取两个字符并复制到另一个字符串中

匹配两个字符串允许一次交换

在Java中一次搜索两个字符串

如果两个字符串在多行中,则只打印一次

Python - 根据后一个字符串的最后一次出现在两个字符串之间找到一个子字符串

检查一个字符串包含两次另一个字符串

如何获得两个字符串之间子字符串的最后一次出现?

替换两个字符串之间的行中最后一次出现的字符串

preg_match以显示包含一个字符串和另外两个字符串之一的行

如果该行两次出现一个字符串,如何删除该行

do ... while()重复最后一个字符串两次

在Python列表中两次使用一个字符串

DrawString方法重复一个字符串两次

std::getline 读取最后一个字符串两次

如何一次将两个字符切换为字符串中的字符

Flutter 比较一个值和两个字符串

一次将Python字符串反转两个字符(网络字节顺序)

用每个字符两次打印一个字符串

使用 sed 在两个字符串之间提取直到第一次出现

如何一次解析两个字符进行一次迭代?

如何查找包含两个字符串的字符串并替换其中一个

Oracle 约束 - 比较两个字符串两次

获取其中列具有R中的一个或两个字符串的行

C ++:如何一次输出两个字母的字符串?

PHP 字符串包含两个字符,然后在开头有一个斜杠

Python / Pandas:在一个步骤中是否不包含两个字符串中的任何一个的列?