r - 如何使用 dplyr 管道删除所有列均为零的行

标签 r dplyr tidyverse

我有以下数据框:

dat <- structure(list(`A-XXX` = c(1.51653275922944, 0.077037240321129, 
0), `fBM-XXX` = c(2.22875185527511, 0, 0), `P-XXX` = c(1.73356698481106, 
0, 0), `vBM-XXX` = c(3.00397859609183, 0, 0)), .Names = c("A-XXX", 
"fBM-XXX", "P-XXX", "vBM-XXX"), row.names = c("BATF::JUN_AHR", 
"BATF::JUN_CCR9", "BATF::JUN_IL10"), class = "data.frame")

dat 
#>                     A-XXX  fBM-XXX    P-XXX  vBM-XXX
#> BATF::JUN_AHR  1.51653276 2.228752 1.733567 3.003979
#> BATF::JUN_CCR9 0.07703724 0.000000 0.000000 0.000000
#> BATF::JUN_IL10 0.00000000 0.000000 0.000000 0.000000

我可以使用此命令删除所有列为零的行:

> dat <- dat[ rowSums(dat)!=0, ]
> dat
                    A-XXX  fBM-XXX    P-XXX  vBM-XXX
BATF::JUN_AHR  1.51653276 2.228752 1.733567 3.003979
BATF::JUN_CCR9 0.07703724 0.000000 0.000000 0.000000

但是我怎样才能用 dplyr 的管道风格来做到这一点呢?

最佳答案

这是一个 dplyr 选项:

library(dplyr)
filter_all(dat, any_vars(. != 0))

#       A-XXX  fBM-XXX    P-XXX  vBM-XXX
#1 1.51653276 2.228752 1.733567 3.003979
#2 0.07703724 0.000000 0.000000 0.000000

这里我们利用这样的逻辑:如果任何变量不等于 0,我们将保留它。这与删除所有变量都为零的行相同。

关于 row.names:

library(tidyverse)
dat %>% rownames_to_column() %>% filter_at(vars(-rowname), any_vars(. != 0))
#         rowname      A-XXX  fBM-XXX    P-XXX  vBM-XXX
#1  BATF::JUN_AHR 1.51653276 2.228752 1.733567 3.003979
#2 BATF::JUN_CCR9 0.07703724 0.000000 0.000000 0.000000

关于r - 如何使用 dplyr 管道删除所有列均为零的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49292870/

相关文章:

r - 创建以按组的变量总和为条件的变量

r - 解析每一行中的字符串并将结果扩展为整洁的数据框

R 使用 data.table 中的条件查找波高于给定值的频率和持续时间

r - 使用 R 的 Proj4 重投影

sql - 如何在R中模拟SQL等级函数?

r - 如何将一列(逗号拆分)转换为 R 中的多列?

r - 生成一个循环来匹配 ID

r - 使用 Shiny 选择列、相等、值来按条件过滤

r - 如何按组(ID)复制最后一行?

r - 计算满足特定标准的独特组合