Расширить фрейм данных с помощью промежуточных наблюдений - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь расширить фрейм данных в R с отсутствующими наблюдениями, которые не сразу очевидны. Вот что я имею в виду:

data.frame(id = c("a","b"),start = c(2002,2004), end = c(2005,2007))

Что такое:

 id start  end
1  a  2002 2005
2  b  2004 2007

То, что я хотел бы, это новый фрейм данных с 8 полными наблюдениями, 4 для каждого «a» и «b», и год, который является одним из значений между началом и концом (включительно). Итак:

id year
a 2002
a 2003
a 2004
a 2005
b 2004
b 2005
b 2006
b 2007

Как я понимаю, различные версии расширения работают только с уникальными значениями, но здесь мой фрейм данных не имеет всех уникальных значений (явно).

Я думал пройтись по каждой строке, а затем с помощью sapply () сгенерировать фрейм данных, а затем объединить все новые фреймы данных. Но эта попытка не удалась:

sapply(test,function(x) { data.frame( id=rep(id,x[["end"]]-x[["start"]]), year = x[["start"]]:x[["end"]] )})

Я знаю, что должен быть какой-то dplyr или другая магия, чтобы решить эту проблему!

Ответы [ 3 ]

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

Используя dplyr и tidyr, я создаю новый столбец, в котором содержится список лет, а затем отменяю вставку кадра данных.

library(tidyr)
library(dplyr)

df <-
  data.frame(
    id = c("a", "b"),
    start = c(2002, 2004),
    end = c(2005, 2007)
  )


df %>% 
  rowwise() %>% 
  mutate(year = list(seq(start, end))) %>% 
  select(-start, -end) %>% 
  unnest()

Вывод

# A tibble: 8 x 2
  id      year
  <fct>  <int>
1 a       2002
2 a       2003
3 a       2004
4 a       2005
5 b       2004
6 b       2005
7 b       2006
8 b       2007
0 голосов
/ 16 мая 2018

Простое решение с data.table:

library(data.table)

# option 1
setDT(df)[, .(year = seq(start, end)), by = id]

# option 2
setDT(df)[, .(year = start:end), by = id]

, которое дает:

   id year
1:  a 2002
2:  a 2003
3:  a 2004
4:  a 2005
5:  b 2004
6:  b 2005
7:  b 2006
8:  b 2007

Подход с базой R:

lst <- Map(seq, df$start, df$end)

data.frame(id = rep(df$id, lengths(lst)), year = unlist(lst))
0 голосов
/ 16 мая 2018

вы можете использовать tidyr и dplyr

library(tidyr)
library(dplyr)

df %>% 
  gather(key = key, value = year, -id) %>% 
  select(-key) %>% 
  group_by(id) %>%
  complete(year = full_seq(year,1))

# A tibble: 8 x 2
# Groups:   id [2]
  id     year
  <fct> <dbl>
1 a      2002
2 a      2003
3 a      2004
4 a      2005
5 b      2004
6 b      2005
7 b      2006
8 b      2007
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...