количество логических значений с суммированием r - PullRequest
0 голосов
/ 16 февраля 2019

В кадре данных у меня есть столбец со значениями Y и N.Этот фрейм данных также имеет столбец идентификатора.Я хотел бы создать два столбца, один с общим количеством Y и другой с общим количеством N для каждого идентификатора.Я пытался выполнить эту процедуру с помощью функции суммирования dplyr

 group_by(id) %>%
 summarise(total_not = count(column_y_e_n == "N"),
           total_yes = count(column_y_e_n == "Y")

, но возражал против сообщения об ошибке

Ошибка в summarise_impl (.data, dots)

Любое предложение?

Ответы [ 4 ]

0 голосов
/ 17 февраля 2019

Я обычно хочу все делать в тидиверсе.Но в этом случае базовое решение R кажется подходящим:

dfr <- data.frame(
  id =  c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3),
  column_y_e_n = c("Y", "N", "Y", "Y", "Y", "Y", "N", "N", "N", "Y", "N", "N", "N")
)

table(dfr)

дает вам:

   column_y_e_n
id  N Y
  1 1 4
  2 3 2
  3 3 0
0 голосов
/ 16 февраля 2019

Небольшое отклонение от оригинального ответа от Харро:

library(tidyr)

dfr <- data.frame(
  id =  c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3),
  bool = c("Y", "N", "Y", "Y", "Y", "Y", "N", "N", "N", "Y", "N", "N", "N")
)

dfrSummary <- dfr %>% 
  group_by(
    id, bool
    ) %>% 
  summarize(
    count = n()
    ) %>% 
  spread(
    key = bool, 
    value = count, 
    fill = 0
    )

0 голосов
/ 16 февраля 2019

Я заменил функцию подсчета на функцию суммы и получил успех.

 group_by(id) %>%
 summarise(total_not = sum(column_y_e_n == "N"),
           total_yes = sum(column_y_e_n == "Y")
0 голосов
/ 16 февраля 2019

Я бы подошел к проблеме, используя group_by и tally ().Или вы можете пропустить средний шаг и использовать счетчик напрямую.

library(tidyverse)

##Fake data
df <- tibble(
    id = rep(1:20,each = 10),
    column_y_e_n = sapply(1:200, function(i)sample(c("Y", "N"),1))
)

##group_by() + tally()
df_2 <- df %>%
    group_by(id, column_y_e_n) %>%
    tally() %>%
    spread(column_y_e_n, n) %>%
    magrittr::set_colnames(c("id", "total_not", "total_yes"))


df_2

#direct method
df_3 <- df %>%
    count(id, column_y_e_n) %>%
    spread(column_y_e_n, n) %>%
    magrittr::set_colnames(c("id", "total_not", "total_yes"))

df_3

Последние каналы распространяют полученный столбец и форматируют имена столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...