Условно считать строки на основе месяца и значения столбца - PullRequest
0 голосов
/ 21 октября 2019

У меня есть набор данных, содержащий списки Airbnb. Я хочу посчитать количество списков для каждого host_id, основываясь на том, являются ли они «Весь дом» или «Общий дом» в месяц. Поэтому я предполагаю, что мне нужны два дополнительных столбца с количеством для каждой строки (tot_EH и tot_SH).

Я разместил изображение ниже, чтобы показать, как выглядит набор данных, и желаемый результат (удалены некоторые столбцы, которые не релевантны). Сейчас я просто использовал один host_id, но на самом деле это много разных.

Помечены новые столбцы красным цветом и введены желаемые результаты. Не могу понять, как поступить. Был бы очень признателен за помощь!

enter image description here

Ответы [ 3 ]

0 голосов
/ 22 октября 2019

Один метод data.table, предполагая, что ваши данные находятся в data.frame с именем df

library(data.table)
setDT(df)
df[room_type_NV == "Entire Home" , tot_EH := .N, by=.(date, host_id)]
df[room_type_NV == "Shared Home" , tot_SH := .N, by=.(date, host_id)]
0 голосов
/ 03 ноября 2019

База R Решение:

df$grouping_var <- paste(df$host_id, as.Date(df$date, "%m-%Y"), sep = "_")

count_df <- data.frame(do.call("rbind", lapply(split(df, df$grouping_var),

                   function(x){

                     tmp <- data.frame(t(tapply(x$room_type_NV, x$room_type_NV, length)))

                     return(cbind(x, data.frame(tmp[rep(seq_len(nrow(tmp)), nrow(x)), ], row.names = NULL)))

                    }

                   )

                  ),

            row.names = NULL

             )

Данные:

    structure(list(id = c(2, 1, 3, 1, 2, 3, 1, 2, 1, 2), date = structure(c(16983, 
16983, 16983, 17014, 17014, 17014, 17045, 17045, 17106, 17106
), class = "Date"), host_id = c(27280608, 27280608, 27280608, 
27280608, 27280608, 27280608, 27280608, 27280608, 27280608, 27280608
), room_type_NV = structure(c(2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 
1L, 2L), .Label = c("Entire home", "Shared home"), class = "factor"), 
    grouping_var = c("27280608_2016-07-01", "27280608_2016-07-01", 
    "27280608_2016-07-01", "27280608_2016-08-01", "27280608_2016-08-01", 
    "27280608_2016-08-01", "27280608_2016-09-01", "27280608_2016-09-01", 
    "27280608_2016-11-01", "27280608_2016-11-01")), row.names = c(NA, 
-10L), class = "data.frame")
0 голосов
/ 22 октября 2019

Получил помощь от коллеги, и это сработало:

df <- df %>%
  group_by(host_id, last_scraped) %>% # group data by host and month
  mutate(count_listings_in_data = length(unique(id)), # for each host/month combination; count the number of unique listing IDs
         count_shared_homes = length(unique(id[which(room_type_NV == "Shared home")])), # for each host/month combination; count the number of unique listing IDs for which the room type is "shared" 
         count_entire_homes = length(unique(id[which(room_type_NV == "Entire home")]))) # for each host/month combination; count the number of unique listing IDs for which the room type is "entire" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...