2016-03-01 6 views
0

Я хотел бы изменить данные на основе двух столбцов в начале и конце года, как данные панели. С изменением формы я могу расплавиться на основе двух уникальных столбцов, но это немного сложно. Я хотел бы расширить его по длине в зависимости от разницы и добавить столбец с именем change (с указанием 1 для первого года и 0 в противном случае). Какие-либо предложения?Измените данные на основе разности двух столбцов лет

Формат: df.

A <- c("xyz", "xyz", "x","x","x", "y") 
start <- c("2001", "1999", "2001", "2000", "1998", "2001") 
end <- c("2002", "2001", "2002", "2001", "2000", "2001") 
df<- data.frame(A, start,end) 

Я хотел бы окончательные данные следующим образом

A  year change 
xyz 2001  1 
xyz 2002  0 
xyz 1999  1 
xyz 2000  0 
x  2001  1 
x  2002  0 
x  2000  1 
x  2001  0 
x  1998  1 
x  1999  0 
x  2000  0 
y  2001  1 
+0

'библиотека (reshape2) расплава (DF, ID = с ("А")) – user3570187

+0

Я попробовал библиотеку splitstackshape для расширения на основе различий <- конец года, но я не получал данные панели. – user3570187

+1

Вы можете попробовать 'data.frame (A = rep (df [, 1], each = 2), year = c (t (df [-1])), change = 1: 0)' –

ответ

-1

Как насчет:

### OP's code 
A <- c("xyz", "xyz", "x","x","x", "y") 
start <- c("2001", "1999", "2001", "2000", "1998", "2001") 
end <- c("2002", "2001", "2002", "2001", "2000", "2001") 
df<- data.frame(A, start,end) 

### cast the variables start and end to integer in df 
start<-as.integer(start) 
end <-as.integer(end) 
df <-data.frame(A, start, end, stringsAsFactors=F) 

### Build up the required columns 
expand_year<-with(df, mapply(seq,start,end)) 
expand_A <- rep(df$A,sapply(expand_year,length)) 
change<-sapply(expand_year,function(x){ c(1,rep(0,length(x)-1)) }) 

### Put all the columns into a data.frame 
final<-data.frame(A=expand_A, 
       year=unlist(expand_year), 
       change=unlist(change)) 

Выход:

> final 
    A year change 
1 xyz 2001  1 
2 xyz 2002  0 
3 xyz 1999  1 
4 xyz 2000  0 
5 xyz 2001  0 
6 x 2001  1 
7 x 2002  0 
8 x 2000  1 
9 x 2001  0 
10 x 1998  1 
11 x 1999  0 
12 x 2000  0 
13 y 2001  1 
+0

Awesome !! Отличное решение :) – user3570187

0

Это можно сделать с помощью пакета "reshape2":

library(reshape2) 
df <- melt(df, id = "A") 

Теперь у нас есть столбец ID, переменная колонка указывая, является ли наблюдение «начальным» или «конечным» годом, а столбец значений, который дает год, соответствующий каждому «старту» и «концу», связанному с каждым идентификатором.

Переменная «change», которую вы описываете, функционально эквивалентна столбцу переменной, создаваемому путем плавления исходного кадра данных. Мы можем более точно повторить его, назначив значение 1 для «запуска» наблюдений и значение 0 для «завершения» наблюдений.

df$change <- 0 
df$change[df$variable == "start"] <- 1