1
  dummy value
1  TRUE  -2.0
2 FALSE   3.0
3 FALSE   4.0
4 FALSE   2.0
5  TRUE  -4.5
6  TRUE   9.0
7  TRUE  -1.0
8 FALSE   0.0
9  TRUE   3.0

structure(list(dummy = c(TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, 
TRUE, FALSE, TRUE), value = c(-2, 3, 4, 2, -4.5, 9, -1, 0, 3)), class = "data.frame", row.names = c(NA, 
-9L))

I would like to count the number of negative (and positive) values of column "value" for observations such that dummy == TRUE.

Any help would be deeply appreciated!

R novice
  • 161
  • 8

2 Answers2

0

base R

Using by:

by(df$dummy, df$value > 0, FUN = sum)

# df$value > 0: FALSE
# [1] 3
# --------------------------------------------------------------------- 
# df$value > 0: TRUE
# [1] 2

Using aggregate:

aggregate(dummy ~ value > 0, data = df, sum)

#   value > 0 dummy
# 1     FALSE     3
# 2      TRUE     2

dplyr

library(dplyr)
df %>% 
  group_by(sign = value > 0) %>% 
  summarise(sum = sum(dummy))

# A tibble: 2 x 2
#   sign    sum
#   <lgl> <int>
# 1 FALSE     3
# 2 TRUE      2

Or, using sign:

df %>% 
  group_by(sign = sign(value)) %>% 
  summarise(sum = sum(dummy))

# A tibble: 3 x 2
   sign   sum
  <dbl> <int>
1    -1     3
2     0     0
3     1     2

df <- structure(list(dummy = c(TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, 
TRUE, FALSE, TRUE), value = c(-2, 3, 4, 2, -4.5, 9, -1, 0, 3)), class = "data.frame", row.names = c(NA, 
-9L))
Maël
  • 45,206
  • 3
  • 29
  • 67
0

Not really clear what your expected output should look like, one option with dplyr may be...

library(dplyr)

dat <- structure(list(dummy = c(TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, 
                         TRUE, FALSE, TRUE), value = c(-2, 3, 4, 2, -4.5, 9, -1, 0, 3)), class = "data.frame", row.names = c(NA, 
                                                                                                                             -9L))

dat %>% 
  filter(dummy) %>%
  mutate(pn = ifelse(value > 0, "pos", "neg")) %>% 
  group_by(pn) %>% 
  summarise(count = n())
#> # A tibble: 2 x 2
#>   pn    count
#>   <chr> <int>
#> 1 neg       3
#> 2 pos       2

Created on 2022-02-18 by the reprex package (v2.0.1)

Peter
  • 11,500
  • 5
  • 21
  • 31