Подсчет появления нескольких столбцов по группам в R - PullRequest
2 голосов
/ 17 апреля 2020

У меня есть df, который выглядит следующим образом:

Room  Item  Red Square  
Basement  Ball  TRUE  FALSE
Basement  Basket  TRUE  TRUE
Basement  Table FALSE TRUE
Basement  Desk TRUE TRUE

Я хочу посчитать количество элементов Square, Red и обоих квадратов + красный, поэтому окончательный DF выглядит следующим образом:

Room Square Red Both
Basement 1 1 2

Я пытался

df %>% 
group_by(Room, Square, Red) %>%
count()

подсчитать категории, но я не уверен, как отформатировать его так, как я хочу.

Ответы [ 3 ]

3 голосов
/ 17 апреля 2020

В этом конвейере необходимо присвоить имена вновь создаваемым переменным с разными именами, чтобы при использовании summarise вторая и третья переменные не использовали вновь созданную переменную Square. Позже я переименую их в том же конвейере.

df %>% 
  group_by(Room) %>% 
  summarise(
    Square_new = sum(Square & !Red),
    Red_new = sum(Red & !Square),
    Both_new = sum(Square & Red)
  ) %>% 
  rename(Square = Square_new, Red = Red_new, Both = Both_new)

Вывод

# A tibble: 1 x 4
#   Room     Square   Red  Both
#   <chr>     <int> <int> <int>
# 1 Basement      1     1     2
1 голос
/ 17 апреля 2020

Попробуй это. Сначала добавьте Both категорию. Во-вторых. Установите Red и Square на FALSE, если Both == TRUE. Затем сумма.

df <- read.table(text = "Room  Item  Red Square  
Basement  Ball  TRUE  FALSE
Basement  Basket  TRUE  TRUE
Basement  Table FALSE TRUE
Basement  Desk TRUE TRUE", header = TRUE)

library(dplyr)

df %>% 
  mutate(Both = Red & Square) %>%
  mutate_at(c("Red", "Square"), ~ .x & !Both) %>%
  group_by(Room) %>% 
  summarise_at(c("Red", "Square", "Both"), sum)
#> # A tibble: 1 x 4
#>   Room       Red Square  Both
#>   <fct>    <int>  <int> <int>
#> 1 Basement     1      1     2

Создано в 2020-04-17 пакетом представить (v0.3.0)

0 голосов
/ 17 апреля 2020

Я понял это, не так элегантно, как @ Ri c S, но:

df2 <- df %>%
  group_by(Room) %>%
  summarise(Square = sum(df$Square == "TRUE" & df$Red == "FALSE"), Red = sum(df$Red == "TRUE" & df$Square == "FALSE"), both = sum(df$Square == "TRUE" & df$Red == "TRUE"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...