столбец с несколькими одинаковыми записями (имя), 2 столбца с разностными данными необходимо распространять в длинный формат - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть данные, подобные приведенным ниже:

name       date   balls.purchased   balls.left
   a     feb-17                10            5
   a     Mar-17                12            4
   a    June-18                14            6
   b     Feb-17                16            1
   b    June-18                18            7

Я должен распространять данные ежемесячно, например, ниже

name  Feb-17   Mar-17  June-18
   a      10       12       14
   b      16       0        18

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

Любая идея сделать то же самое будет высоко оценена.

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Без четкого воспроизводимого примера я не могу быть уверен, но я верю, что это то, что вы хотите:

dd <- tibble::tribble(
  ~name,       ~date,   ~balls.purchased,   ~balls.left,
  'a',     'Feb-17',                10,            5,
  'a',     'Mar-17',                12,            4,
  'a',    'June-18',                14,            6,
  'b',     'Feb-17',                16,            1,
  'b',    'June-18',                18,            7
)

library(dplyr)
library(tidyr)

dd %>%
  gather(key, value, -name, -date) %>%
  unite('key', date, key) %>%
  spread(key, value, fill = 0)

# A tibble: 2 x 7
  name  `Feb-17_balls.left` `Feb-17_balls.purchased` `June-18_balls.left` `June-18_balls.purchased` `Mar-17_balls.left` `Mar-17_balls.purchased`
  <chr>               <dbl>                    <dbl>                <dbl>                     <dbl>               <dbl>                    <dbl>
1 a                       5                       10                    6                        14                   4                       12
2 b                       1                       16                    7                        18                   0                        0
0 голосов
/ 18 декабря 2018

Это моё предлагаемое решение:: 1001 *

library(tidyverse)

df<-read.table(text="name       date   balls.purchased   balls.left
   a     Feb-17                10            5
               a     Mar-17                12            4
               a    June-18                14            6
               b     Feb-17                16            1
               b    June-18                18            7",header=T)
df %>% 
  gather("id","value",3:4) %>% 
 spread(date,value)

Это дает:

name              id Feb-17 June-18 Mar-17
1    a      balls.left      5       6      4
2    a balls.purchased     10      14     12
3    b      balls.left      1       7     NA
4    b balls.purchased     16      18     NA

Похоже, вы хотите только две строки.Это кажется маловероятным, на мой взгляд, учитывая, что имена не являются уникальными, если вы не вернетесь к широкому формату.

0 голосов
/ 17 декабря 2018

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

Давайте назовем ваши данные df

library(reshape2)
df1 <- melt(df)

Затем приведемданные для размещения месяцев в отдельных столбцах.

dcast(df1, name + variable ~ date)

#  name        variable feb-17 Feb-17 June-18 Mar-17
#1    a balls.purchased     10     NA      14     12
#2    a      balls.left      5     NA       6      4
#3    b balls.purchased     NA     16      18     NA
#4    b      balls.left     NA      1       7     NA

В формуле мы сообщаем функции, что name и variable являются переменными идентификатора, а записи для date будут переменными значения.

...