Как предотвратить сброс групп R размером 0 - PullRequest
0 голосов
/ 06 июня 2018

Я использую следующий код для подсчета количества дней, в течение которых сайты превышают 90.

temp2 <- temp %>%
    filter(ds > '2017-12-31') %>%
    filter(over90 == 1) %>%
    group_by(site) %>%
    tally()

Тем не менее, это отбрасывает сайты, у которых не осталось дней более 90. Я хочу, чтобы мои выходные включали этисайты со значением ноль, а не просто не существующие.В любом случае, как я могу это сделать?

Притворные данные:

site over90
a    1
a    0
a    1
b    0

Что происходит:

site n
a    2

Что я хочу:

site n
a    2
b    0

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Если ваша site является факторной переменной, вы можете использовать tidyr::complete для заполнения пробелов в конце:

filter(dd, over90 == 1) %>% 
  group_by(site) %>% 
  tally() %>% 
  complete(site, fill = list(n = 0))
# A tibble: 2 x 2
    site     n
  <fctr> <dbl>
1      a     2
2      b     0

data

dd <- read.table(text = 
"site over90
a    1
a    0
a    1
b    0",
header = TRUE)
0 голосов
/ 06 июня 2018

tally делает не совсем то, что вы хотите.Поскольку вы просто хотите подсчитать количество строк, где over_90 равно единице, а эта переменная является двоичной, вы можете суммировать этот столбец, чтобы получить эффект подсчета.

df = data_frame(site=sample(letters[1:3], 10, replace=TRUE),
                over_90=sample(0:1, 10, replace=TRUE))
df
# A tibble: 10 x 2
#    site over_90
#   <chr>   <int>
# 1     c       0
# 2     b       1
# 3     c       0
# 4     b       0
# 5     c       1
# 6     b       0
# 7     a       0
# 8     a       1
# 9     c       1
#10     c       0

df$over_90[df$site == 'c'] = 0
df %>% group_by(site) %>% summarise(n = sum(over_90))
# A tibble: 3 x 2
#   site     n
#  <chr> <dbl>
#1     a     1
#2     b     1
#3     c     0
0 голосов
/ 06 июня 2018

Один из вариантов - использовать table.Но сначала вы должны преобразовать site в factor, чтобы после вызова функции table учитывался счет всех факторов.

library(dplyr)

df %>% mutate(site = as.factor(site)) %>%   #This line is very important. 
  filter(over90 ==1) %>%                               
  group_by(site) %>%
  table()

# site 1
# a    2
# b    0

Данные:

df <- read.table(text = 
"site over90
a    1
a    0
a    1
b    0",
header = TRUE, stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...