2016-10-13 5 views
0

У меня есть аналогичный фрейм данных как df, который выглядит как реестр записей и выходов в системе.R Добавить строки при изменении формы фрейма

df = data.frame(id = c("A", "B"), entry = c(2011, 2014), exit = c(2013, 2015)) 

> df 
    id entry exit 
1 A 2011 2013 
2 B 2014 2015 

Моя цель - представить мой df в длинном формате. gather() от tidyr позволяет сделать что-то вроде этого.

df_long = df %>% gather(registry, time, entry:exit) %>% arrange(id) 

> df_long 
    id registry time 
1 A entry 2011 
2 A  exit 2013 
3 B entry 2014 
4 B  exit 2015 

Тем не менее, я застрял на том, как я мог бы включить дополнительные строки, которые будут представлять время, что мои наблюдения (id) эффективно в системе. Мой желаемый data.frame тогда будет выглядеть примерно так:

id time 
1 A 2011 
2 A 2012 
3 A 2013 
4 B 2013 
5 B 2014 
6 B 2015 

Любая идея, как я могу сделать это более чем приветствуется и очень ценна.

ответ

1

Вот способ, чтобы получить в сторону нужного решения:

df1 <- data.frame(id = c("A", "B"), entry = c(2011, 2014), exit = c(2013, 2015)) 
setNames(stack(by(df1, df1$id, function(x) x$entry : x$exit))[,c(2,1)], 
    c('id','time')) 

    id time 
1 A 2011 
2 A 2012 
3 A 2013 
4 B 2014 
5 B 2015 
+0

Спасибо @bouncyball. Считаете ли вы, что этот подход позволил бы для большего количества переменных, таких как, например, 'df1 <- data.frame (id = c (" A "," B "), region = c (" country.1 "," country.2 "), entry = c (2011, 2014), exit = c (2013, 2015)) '? – Edu

0

UPDATE: Другое решение на основе plyr включения комментарий выше может быть:

df1 <- data.frame(id = c("A", "B"), region = c("country.1", "country.2"), entry = c(2011, 2014), exit = c(2013, 2015)) 

library(plyr) 
ddply(df1, .(id,region), summarize, time=seq(entry, exit)) 

Это дает:

id region  time 
1 A country.1  2011 
2 A country.1  2012 
3 A country.1  2013 
4 B country.2  2014 
5 B country.2  2015 
+0

Я собирался ссылаться на [этот ответ] (http://stackoverflow.com/questions/11494511/expanding-a-sequence-in-a-data-frame), но похоже, что вы нашли способ сделать это по расширенному вопросу. – bouncyball

+0

Спасибо в любом случае @bouncyball. Я пытаюсь реплицировать в 'dplyr' (возможно, быстрее для больших образцов) – Edu