计算每列 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
我有一个 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