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