2014-09-02 2 views
1

Мой образец dataframe в R выглядит следующим образом:R: Переформуйте и расширить dataframe в R

 NAME ID SURVEY_YEAR REFERENCE_YEAR CUMULATIVE_SUM CUMULATIVE_SUM_REFYEAR 
1 NAME1 47  1960   1959    -6      0 
2 NAME1 47  1961   1960   -10      -6 
3 NAME1 47  1963   1961    NA      NA 
4 NAME1 47  1965   1963   -23     -10 
5 NAME2 259  2007   2004    -9      0 
6 NAME2 259  2009   2007    NA      NA 
7 NAME2 259  2010   2009    NA      NA 
8 NAME2 259  2011   2010    NA      NA 
9 NAME2 259  2014   2011   -40      -9 

То, что я пытаюсь сделать, это переставить dataframe следующим образом.

NAME ID time   YEAR CUMULATIVE_SUM id 
NAME1 47 REFERENCE_YEAR 1959 0    1 
NAME1 47 SURVEY_YEAR  1960 -6    1 
NAME1 47 REFERENCE_YEAR 1960 -6    2 
NAME1 47 SURVEY_YEAR  1961 -10    2 
NAME1 47 REFERENCE_YEAR 1961 NA    3 
NAME1 47 SURVEY_YEAR  1963 NA    3 
NAME1 47 REFERENCE_YEAR 1963 -10    4 
NAME1 47 SURVEY_YEAR  1965 -23    4 
NAME2 259 REFERENCE_YEAR 2004 0    5 
NAME2 259 SURVEY_YEAR  2007 -9    5 
NAME2 259 REFERENCE_YEAR 2007 NA    6 
NAME2 259 SURVEY_YEAR  2009 NA    6 
NAME2 259 REFERENCE_YEAR 2009 NA    7 
NAME2 259 SURVEY_YEAR  2010 NA    7 
NAME2 259 REFERENCE_YEAR 2010 NA    8 
NAME2 259 SURVEY_YEAR  2011 NA    8 
NAME2 259 REFERENCE_YEAR 2011 -9    9 
NAME2 259 SURVEY_YEAR  2014 -40    9  

Я пытаюсь сделать это следующим образом, но это не совсем то, что я хочу.

# read in data 
data <- data.frame(NAME=c("NAME1", "NAME1","NAME1","NAME1","NAME2","NAME2","NAME2","NAME2","NAME2"), 
        ID=c(47,47,47,47,259,259,259,259,259), 
        SURVEY_YEAR=c(1960,1961,1963,1965,2007,2009,2010,2011,2014), 
        REFERENCE_YEAR=c(1959,1960,1961,1963,2004,2007,2009,2010,2011), 
        CUMULATIVE_SUM=c(-6,-10,NA,-23,-9,NA,NA,NA,-40), 
        CUMULATIVE_SUM_REFYEAR=c(0,-6,NA,-10,0,NA,NA,NA,-9)) 

# reshape data 
dat3 <- reshape(data, direction="long", 
        varying = list(c("SURVEY_YEAR","REFERENCE_YEAR"), c("CUMULATIVE_SUM","CUMULATIVE_SUM_REFYEAR")), 
        v.names=c("YEAR","CUMULATIVE_SUM"), times = c("SURVEY_YEAR", "REFERENCE_YEAR")) 

Кто-нибудь есть идеи, как правильно перекроить dataframe так, что оно соответствует искомому решению выше? Благодарю.

ответ

1

Просто реорганизовать данные, которые вы уже

dat3 <- dat3[with(dat3, order(NAME, ID, YEAR, id)), ] 

Или, если вы хотите иметь высокую производительность

library(data.table) 
setkey(setDT(dat3), NAME, ID, YEAR, id) 
+0

выбрал свой высокий пример производительности Дэвид, и он работает как шарм! спасибо и всем остальным, кто внес свой вклад! – kurdtc

0

Что-то, как это должно работать

data["id"]<- c(1,2,3,4,5,6,7,8,9) 

sursub<-data # make subset 
refsub<-data # make subset 

sursub["time"]<-"SURVEY_YEAR" #add column 
sursub["REFERENCE_YEAR"]<- 0 #remove reference_year 

refsub["time"]<- "REFERENCE_YEAR" #add column 
refsub["SURVEY_YEAR"]<- 0 #remove survey_year 

merge<-rbind(sursub, refsub) #merge two subsets back together 

sorted<- merge[with(merge, order(id)), ] #sort based on id column 
sorted["year"]<-sorted[,3]+sorted[,4] #make year column with the observation year 

Это то просто вопрос удаление ненужных столбцов.

0

Или вы могли бы использовать dplyr

library(dplyr) 
library(tidyr) 
data%>% 
gather(time, YEAR, 3:4)%>% 
mutate(CUMULATIVE_SUM=ifelse(time=="SURVEY_YEAR", CUMULATIVE_SUM, CUMULATIVE_SUM_REFYEAR)) %>% 
arrange(NAME, ID, YEAR, row_number()) %>% 
select(c(1:2, 5:6,3)) %>% 
head(4) 
#  NAME ID   time YEAR CUMULATIVE_SUM 
#1 NAME1 47 REFERENCE_YEAR 1959    0 
#2 NAME1 47 SURVEY_YEAR 1960    -6 
#3 NAME1 47 REFERENCE_YEAR 1960    -6 
#4 NAME1 47 SURVEY_YEAR 1961   -10 
0

Try:

ddf2 = data.frame(NAME=character(), ID=numeric(), time=character(), YEAR=numeric(), CUMULATIVE_SUM=numeric(), id=numeric(), stringsAsFactors=F) 
for (r in 1:nrow(data)){ 
    ddf2[nrow(ddf2)+1,]=c(as.character(data[r,1]), data[r,2], "REFERENCE_YEAR", data[r,4], data[r,6], rownames(data)[r]) 
    ddf2[nrow(ddf2)+1,]=c(as.character(data[r,1]), data[r,2], "SURVEY_YEAR", data[r,3], data[r,5], rownames(data)[r]) 
} 

ddf2 
    NAME ID   time YEAR CUMULATIVE_SUM id 
1 NAME1 47 REFERENCE_YEAR 1959    0 1 
2 NAME1 47 SURVEY_YEAR 1960    -6 1 
3 NAME1 47 REFERENCE_YEAR 1960    -6 2 
4 NAME1 47 SURVEY_YEAR 1961   -10 2 
5 NAME1 47 REFERENCE_YEAR 1961   <NA> 3 
6 NAME1 47 SURVEY_YEAR 1963   <NA> 3 
7 NAME1 47 REFERENCE_YEAR 1963   -10 4 
8 NAME1 47 SURVEY_YEAR 1965   -23 4 
9 NAME2 259 REFERENCE_YEAR 2004    0 5 
10 NAME2 259 SURVEY_YEAR 2007    -9 5 
11 NAME2 259 REFERENCE_YEAR 2007   <NA> 6 
12 NAME2 259 SURVEY_YEAR 2009   <NA> 6 
13 NAME2 259 REFERENCE_YEAR 2009   <NA> 7 
14 NAME2 259 SURVEY_YEAR 2010   <NA> 7 
15 NAME2 259 REFERENCE_YEAR 2010   <NA> 8 
16 NAME2 259 SURVEY_YEAR 2011   <NA> 8 
17 NAME2 259 REFERENCE_YEAR 2011    -9 9 
18 NAME2 259 SURVEY_YEAR 2014   -40 9 
+0

Столбец CUMULATIVE_SUM не является 'numeric' в вашем результате' class (ddf2 $ CUMULATIVE_SUM) # [1] "character" ' – akrun

+0

Я не знаю, почему все столбцы преобразуются в символы, даже если я указал в создании фрейма данных для некоторые должны быть числовыми. Если это важно, as.numeric() и т. Д. Необходимо добавить в операторы присваивания циклов for. Какие-либо предложения? – rnso

+0

@mso Я думаю, что вы должны указать в 'options'. или может использоваться 'data.frame' вместо' c'. Не проверено. – akrun

Смежные вопросы