R изменение формы данных и обобщение информации - PullRequest
0 голосов
/ 13 мая 2018

У меня есть набор данных, содержащий продажи на человека за несколько лет. Образец здесь:

yr_2008 <- data.frame(agent = c("agent1", "agent4", "agent1", "agent1", "agent1", "agent4"), sales = c(100, 200, 300, 130, 200, 400), year = 2008)
yr_2009 <- data.frame(agent = c("agent1", "agent3", "agent4", "agent1", "agent3", "agent4", "agent1", "agent3", "agent4"), sales = c(200, 500, 200, 200, 100, 100, 200, 300, 200), year = 2009)
yr_2010 <- data.frame(agent = c("agent1", "agent4", "agent2", "agent2", "agent2", "agent4"), sales = c(130, 300, 100, 200, 100, 200), year = 2010)
sales <- rbind(yr_2008, yr_2009, yr_2010)

Как правильно составлять сводки по каждому человеку за каждый год? Например, я хочу видеть для каждого года, сколько раз человек совершил продажу, и сколько. Если в тот год человека там не было, просто имей АН. Например, в 2008 году я хочу получить это как вывод

 sales_output <- data.frame(agent = c("agent1", "agent2", "agent3", "agent4"),
                       yr08_transaction = c(3, NA, NA, 2),
                       yr08_sales = c(730, NA, NA, 600))

Я также хочу, чтобы вся эта информация содержалась только в одной таблице, например:

Расширение:

sales_output <- data.frame(agent = c("agent1", "agent2", "agent3", "agent4"),
                       yr08_transaction = c(3, NA, NA, 2),
                       yr08_sales = c(730, NA, NA, 600),
                       yr09_transaction = c(3, 0, 3, 3), 
                       yr09_sales = c(600, 0, 900, 500),
                       yr10_transaction = c(1, 3, 0, 2),
                       yr10_sales = c(130, 400, 0, 500))

sales_output
agent yr08_transaction yr08_sales yr09_transaction yr09_sales yr10_transaction yr10_sales
1 agent1                3        730                3        600                1        130
2 agent2               NA         NA                0          0                3        400
3 agent3               NA         NA                3        900                0          0
4 agent4                2        600                3        500                2        500

Спасибо!

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

Используя dplyr с right_join

sales$agent <- as.character(sales$agent)

sales %>% filter(year==2008) %>% group_by(agent) %>% 
  summarise(yr08_transaction=n(),yr08_sales=sum(sales)) %>% 
  right_join(sales[!duplicated(sales$agent),c('agent','year')],by="agent") %>%
  arrange(agent) %>% select(-year)

# A tibble: 4 x 3
agent yr08_transaction yr08_sales
<chr>            <int>      <dbl>
1 agent1                4        730
2 agent2               NA         NA
3 agent3               NA         NA
4 agent4                2        600
0 голосов
/ 13 мая 2018

Вот вариант с data.table. Суммируйте, чтобы получить количество наблюдений и sum «продаж», сгруппированных по «агенту» и «году» и dcast в «широком» формате

library(data.table)
dcast(setDT(sales)[, .(transaction = .N, Sumsales = sum(sales)), by = .(agent, year)],
     agent ~ substr(year, 3, 4), value.var = c('transaction', 'Sumsales'))
0 голосов
/ 13 мая 2018

Вот рабочий процесс dplyr. Если вы возьмете эти данные и сгруппируете их по годам и агентам, вы сможете рассчитать суммы продаж и количество записей на одного агента в год. Чтобы получить это в широком формате, используйте gather, чтобы сначала сделать его более длинным, поместив как продажи, так и транзакции в один столбец, unite год с мерой, поэтому у вас есть записи, такие как "2009_sales", затем spread чтобы вернуть его в ширину. spread также заполняет пропущенные значения с помощью NA.

library(tidyverse)

yr_2008 <- data.frame(agent = c("agent1", "agent4", "agent1", "agent1", "agent1", "agent4"), sales = c(100, 200, 300, 130, 200, 400), year = 2008)
yr_2009 <- data.frame(agent = c("agent1", "agent3", "agent4", "agent1", "agent3", "agent4", "agent1", "agent3", "agent4"), sales = c(200, 500, 200, 200, 100, 100, 200, 300, 200), year = 2009)
yr_2010 <- data.frame(agent = c("agent1", "agent4", "agent2", "agent2", "agent2", "agent4"), sales = c(130, 300, 100, 200, 100, 200), year = 2010)
sales <- rbind(yr_2008, yr_2009, yr_2010)

sales_summary <- sales %>%
    group_by(year, agent) %>%
    summarise(sales = sum(sales), transactions = n()) %>%
    gather(key = type, value = value, sales, transactions) %>%
    unite("yr", year, type) %>%
    spread(key = yr, value = value, sep = "")

sales_summary
#> # A tibble: 4 x 7
#>   agent  yr2008_sales yr2008_transactions yr2009_sales yr2009_transactions
#>   <fct>         <dbl>               <dbl>        <dbl>               <dbl>
#> 1 agent1          730                   4          600                   3
#> 2 agent4          600                   2          500                   3
#> 3 agent3           NA                  NA          900                   3
#> 4 agent2           NA                  NA           NA                  NA
#> # ... with 2 more variables: yr2010_sales <dbl>, yr2010_transactions <dbl>

Создано в 2018-05-13 пакетом Представ (v0.2.0).

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