计算每列中的非零值 tidyverse

发布于 2025-01-20 16:42:55 字数 636 浏览 1 评论 0原文

我有一个带有一堆站点和一堆变量的 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

I have a df with a bunch of sites and a bunch of variables. I need to count the number of non-zero values for each site. I feel like I should be able to do this with summarize() and count() or tally(), but can't quite figure it out.

reprex:


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)))

desired output:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

沉睡月亮 2025-01-27 16:42:55

一个可能的解决方案:

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

基本R中的另一种可能的解决方案:

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

#> site1 site2 site3 
#>     2     3     1

A possible solution:

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

Another possible solution, in base R:

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

#> site1 site2 site3 
#>     2     3     1
踏月而来 2025-01-27 16:42:55

在基本R中,您可以使用colsums

colSums(df[-1] > 0)

#> site1 site2 site3 
#>     2     3     1 

In base R, you can use colSums:

colSums(df[-1] > 0)

#> site1 site2 site3 
#>     2     3     1 
内心荒芜 2025-01-27 16:42:55

这是另一个使用 purrrtidyverse 选项:

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

Here is another tidyverse option using purrr:

library(tidyverse)

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

# site1 site2 site3 
#   2     3     1 

Or an option using data.table:

library(data.table)

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

#   site1 site2 site3
#1:     2     3     1
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文