计算每列 tidyverse 中的非零值

count nonzero values in each column tidyverse

我有一个 df,里面有一堆网站和一堆变量。我需要计算每个站点的非零值的数量。我觉得我应该可以用 summarize()count()tally() 来做到这一点,但不太明白。

代表:


df <- 
  tribble(
    ~variable,   ~site1,   ~site2,  ~site3,
    "var1",        0 ,       1,        0,
    "var2",        .5,       0,        0,
    "var3",        .1,       2,        0,
    "var4",        0,        .8,       1
  )


# does not work:
df %>%
  summarise(across(where(is.numeric), ~ count(.x>0)))

期望的输出:

# A tibble: 1 × 3
  site1 site2 site3
  <dbl> <dbl> <dbl>
1   2     3     1

可能的解决方案:

library(dplyr)

df %>% 
  summarise(across(starts_with("site"), ~ sum(.x != 0)))

#> # A tibble: 1 × 3
#>   site1 site2 site3
#>   <int> <int> <int>
#> 1     2     3     1

另一种可能的解决方案,在 base R 中:

apply(df[-1], 2, \(x) sum(x != 0))

#> site1 site2 site3 
#>     2     3     1

在基础 R 中,您可以使用 colSums:

colSums(df[-1] > 0)

#> site1 site2 site3 
#>     2     3     1 

这是另一个 tidyverse 选项,使用 purrr:

library(tidyverse)

df[,-1] %>% 
  map_dbl(~sum(. != 0))

# site1 site2 site3 
#   2     3     1 

或使用 data.table 的选项:

library(data.table)

as.data.table(df[,-1])[, lapply(.SD, function(x) sum(x!=0))]

#   site1 site2 site3
#1:     2     3     1