如何使用dplyr独立地为每列过滤行

xtfmy6hx  于 2023-02-06  发布在  其他
关注(0)|答案(4)|浏览(214)

我有以下建议:

library(tidyverse)
df <- tibble::tribble(
  ~gene, ~colB, ~colC,
  "a",   1,  2,
  "b",   2,  3,
  "c",   3,  4,
  "d",   1,  1
)

df
#> # A tibble: 4 x 3
#>    gene  colB  colC
#>   <chr> <dbl> <dbl>
#> 1     a     1     2
#> 2     b     2     3
#> 3     c     3     4
#> 4     d     1     1

我想要做的是过滤gene列之后的每一列,以寻找大于或等于2(〉= 2)的值。

gene, colB, colC
a   NA   2
b   2    3
c   3    4

我怎样才能做到呢?
基因后面的列数实际上不止2。

ut6juiuv

ut6juiuv1#

一个解决方案:从宽格式转换为长格式,这样你就可以只过滤一列,如果需要的话,在最后转换回宽格式。2注意这将丢弃没有值满足条件的基因。

library(tidyverse)
df %>% 
gather(name, value, -gene) %>% 
  filter(value >= 2) %>% 
  spread(name, value)

# A tibble: 3 x 3
   gene  colB  colC
* <chr> <dbl> <dbl>
1     a    NA     2
2     b     2     3
3     c     3     4
tp5buhyn

tp5buhyn2#

即将发布的dplyr 0.6(现在可以从GitHub安装)有filter_at,它可以用来过滤任何值大于或等于2的行,然后na_if可以类似地通过mutate_at应用,因此

df %>% 
    filter_at(vars(-gene), any_vars(. >= 2)) %>% 
    mutate_at(vars(-gene), funs(na_if(., . < 2)))
#> # A tibble: 3 x 3
#>    gene  colB  colC
#>   <chr> <dbl> <dbl>
#> 1     a    NA     2
#> 2     b     2     3
#> 3     c     3     4

或类似地,

df %>% 
    mutate_at(vars(-gene), funs(na_if(., . < 2))) %>% 
    filter_at(vars(-gene), any_vars(!is.na(.)))

其可以被转换为与DPLYR0.5:

df %>% 
    mutate_at(vars(-gene), funs(na_if(., . < 2))) %>% 
    filter(rowSums(is.na(.)) < (ncol(.) - 1))

都返回相同的内容。

7d7tgy0s

7d7tgy0s3#

我们可以使用data.table

library(data.table)
setDT(df)[df[, Reduce(`|`, lapply(.SD, `>=`, 2)), .SDcols = colB:colC]
   ][, (2:3) := lapply(.SD, function(x) replace(x, x < 2, NA)), .SDcols = colB:colC][]
#   gene colB colC
#1:    a   NA    2
#2:    b    2    3
#3:    c    3    4

或使用melt/dcast

dcast(melt(setDT(df), id.var = 'gene')[value>=2], gene ~variable)
#   gene colB colC
#1:    a   NA    2
#2:    b    2    3
#3:    c    3    4
ejk8hzay

ejk8hzay4#

或者我们也可以尝试下面的代码

df %>% rowwise %>% 
filter(any(c_across(starts_with('col'))>=2)) %>% 
mutate(across(starts_with('col'), ~ifelse(!(.>=2), NA, .)))

创建于2023年2月5日,使用reprex v2.0.2

# A tibble: 3 × 3
# Rowwise: 
  gene   colB  colC
  <chr> <dbl> <dbl>
1 a        NA     2
2 b         2     3
3 c         3     4

相关问题