R中如何去除一行中一半为0的行

R中如何去除一行中一半为0的行

一、 数据

生成一个0、1的矩阵,并将矩阵转换为数据框,对行、列名重命名。

data<- matrix(sample(0:1,size = 30,replace = T),nrow = 5)
data <- as.data.frame( data)
names( data) <- paste("col",1:6,sep = "")
row.names(data) <- paste("row",1:5,sep = "")
> data
     col1 col2 col3 col4 col5 col6
row1    1    0    1    1    0    0
row2    1    0    0    0    0    1
row3    1    0    1    0    0    0
row4    0    1    0    1    1    0
row5    1    1    1    0    1    1

二、R

第一种方式

利用等式判断data数据行列是否等于0,得到的是一个数据框;对数据库的每一行求平均值,设置筛选条件大于0.5的行取出来,得到最后的数据。

>#此处不同的地方是data是否等于0,涉及到Ture、False的判断
> data[rowMeans( data != 0 ) > 0.5, ]
> 或者 data[rowMeans( data == 0 ) < 0.5, ]
>最终结果
>    	  col1 col2 col3 col4 col5 col6
	row5    1    1    1    0    1    1 
————————————————————————————————————————————————————------
分步解读
> data != 0 
> 不等于0的值就是TRUE,也是1,等于0的就是FALSE了;计算不等于0的值有多少。
      col1  col2  col3  col4  col5  col6
row1  TRUE FALSE  TRUE  TRUE FALSE FALSE
row2  TRUE FALSE FALSE FALSE FALSE  TRUE
row3  TRUE FALSE  TRUE FALSE FALSE FALSE
row4 FALSE  TRUE FALSE  TRUE  TRUE FALSE
row5  TRUE  TRUE  TRUE FALSE  TRUE  TRUE
>  rowMeans( data != 0 )
 统计矩阵中每行不为0的元素的均值。
 
     row1      row2      row3      row4      row5 
0.5000000 0.3333333 0.3333333 0.5000000 0.8333333 

> rowMeans( data != 0 ) > 0.5
 得到行不为0的均值大于0.5的情况,就是半数不为0的行名称
 
 row1  row2  row3  row4  row5 
FALSE FALSE FALSE FALSE  TRUE 

> data[rowMeans( data != 0 ) > 0.5, ]
> 
     col1 col2 col3 col4 col5 col6
row5    1    1    1    0    1    1

—————————————————————————————

第二种方式

利用apply函数对行为0进行求均值,当均值大于0.5时,说明该行有一半的值都是0,利用which函数对为0的行反向取值,得到row5。

> data[-which(apply(data == 0, 1, mean) > 0.5), ]
> 
	     col1 col2 col3 col4 col5 col6
	row5    1    1    1    0    1    1
	
> which(apply(data == 0, 1, mean) >= 0.5)
> 
	row1 row2 row3 row4 
	   1    2    3    4 
	   
> data[-which(apply(data == 0, 1, mean) >= 0.5), ]
> 
	     col1 col2 col3 col4 col5 col6
	row5    1    1    1    0    1    1
	
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值