2016-10-04 5 views
-1

Я хотел бы попросить о помощи информаций выписки из заголовкаR Создать новый столбец из заголовка и реорганизовать таблицу с помощью петли

У меня есть таблица с сотнями строк и 1000 столбцов (равными) в файле (пример ниже), как этот, и я хотел бы создать цикл для извлечения дат из части заголовка (новый столбец) и изменить порядок значений в строках.

R2n_19970919__105056604_2_BF.MER_A123_DAY_00.nc <- c(0.09,0.09,0.08,0.08,0.06,0.07,0.09,0.08,0.08,"NA") 
R2n_19970920__105056604_2_BF.MER_A123_DAY_00.nc <- c(0.08,0.08,0.08,0.07,"NA",0.05,0.08,0.08,0.08,"NA") 
R2n_19970921__105056604_2_BF.MER_A123_DAY_00.nc <- c(0.07,"NA",0.08,"NA","NA",0.07,0.06,"NA",0.08,"NA") 
data <- data.frame(R2n_19970919__105056604_2_BF.MER_A123_DAY_00.nc,R2n_19970920__105056604_2_BF.MER_A123_DAY_00.nc,R2n_19970921__105056604_2_BF.MER_A123_DAY_00.nc) 

Как это сделать лучше всего? Помощь будет высоко оценена.

Вот мой ожидаемый результат:

R2n_ __105056604_2_BF.MER_A123_DAY_00.nc = 1997/09/19.

Date  R2n.nc   
1997/09/19 0.09   
1997/09/19 0.09 
1997/09/19 0.08 
1997/09/19 0.08 
1997/09/19 0.06 
1997/09/19 0.07 
1997/09/19 0.09 
1997/09/19 0.08 
1997/09/19 0.08 
1997/09/19 NA 
1999/09/20 0.08   
1999/09/20 0.08 
1999/09/20 0.08 
1999/09/20 0.07 
1999/09/20 NA 
1999/09/20 0.05 
1999/09/20 0.08 
1999/09/20 0.08 
1999/09/20 0.08 
1999/09/20 NA 
2001/09/21 ... 
. 
. 
. 
+0

Измените данные в длинном формате, извлеките часть даты и принудите ее к 'as.Date'. –

+0

@ RomanLuštrik Вы предлагаете изменить название и описание? – Gustavo

+0

Нет, он предлагает решение. Посмотрите на '? Reshape' – Sotos

ответ

1

Вот решение, используя советы предложил @Roman Luštrik:

library(stringr) # str_sub() function 
library(reshape2) # melt() function 

# Modify columns names (if date information is always at the same position) 
names(data) = paste0(str_sub(names(data), 5,8), "-", str_sub(names(data), 9,10), "-",str_sub(names(data), 11, 12)) 
data$id = seq(1,nrow(data)) 

# Melt the data 
data_melt = melt(data, id = "id") 


> data_melt 
    id variable value 
1 1 1997-09-19 0.09 
2 2 1997-09-19 0.09 
3 3 1997-09-19 0.08 
4 4 1997-09-19 0.08 
5 5 1997-09-19 0.06 
... 
+0

Perfect @bVa. Отличное решение. Большое спасибо Roman и bVa! – Gustavo

0
library(anytime) 

df <- stack(data) 
df$ind <- anydate(substr(df$ind, 5, 12)) 

head(df) 
## values  ind 
## 1 0.09 1997-09-19 
## 2 0.09 1997-09-19 
## 3 0.08 1997-09-19 
## 4 0.08 1997-09-19 
## 5 0.06 1997-09-19 
## 6 0.07 1997-09-19 

Хотя я бы, вероятно, сделать:

library(anytime) 
library(dplyr) 

tbl_df(data) %>% 
    stack() %>% 
    mutate(ind=anydate(substr(ind, 5, 12))) 
## # A tibble: 30 × 2 
## values  ind 
##  <chr>  <date> 
## 1 0.09 1997-09-19 
## 2 0.09 1997-09-19 
## 3 0.08 1997-09-19 
## 4 0.08 1997-09-19 
## 5 0.06 1997-09-19 
## 6 0.07 1997-09-19 
## 7 0.09 1997-09-19 
## 8 0.08 1997-09-19 
## 9 0.08 1997-09-19 
## 10  NA 1997-09-19 
## # ... with 20 more rows 

вместо этого.

+0

Не работает @hrbrmstr. Ошибка в файле stack.data.frame (x, ...): не были выбраны векторные столбцы. – Gustavo

+0

использует 'stringsAsFactors = FALSE' в создании фрейма данных. – hrbrmstr

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