Реструктуризация кадра данных в R из широкого формата до двух столбцов

Я работаю над набором данных, который имеет 4 столбца, которые представляют, когда был вырублен определенный участок леса.

Три из этих столбцов представляют год, а каждая строка представляет месяц. например Столбец: 2015 г., строка: 1 = январь 2015 г.

Последний столбец - уникальный идентификатор для каждого сайта.

Для моего анализа мне нужно реструктурировать эти данные так, чтобы это были 2 строки, сайт и формат даты для вырезки. Поскольку мы не знаем точного дня, мы выбрали 15-е число каждого месяца в качестве прокси.

Я приложил фотографии данных и резюме.

введите описание изображения здесь

введите описание изображения здесь

Конечный результат, которого я хотел бы, такой

uniqueid <- c(21000, 23400, 26800)
cut <- as.Date(c('2015-1-15','2016-3-15','2017-3-15'))
stack_example <- data.frame(uniqueid, cut)

Может ли кто-нибудь помочь мне реструктурировать данные, чтобы они были похожи на результат примера?

введите описание изображения здесь

Большое тебе спасибо

‹********************************************************************************************************************************************************************************************************************************************************************************************************.

 dput(head(clf))

структура (список (X2017 = c (NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), X2016 = c (NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_c, NA_integer_ NA_integer_, NA_integer_), idunique = 1: 6), row.names = c (NA, 6L), class = data.frame)


person Kilian Murphy    schedule 01.02.2021    source источник
comment
Не могли бы вы показать dput небольших данных, чтобы я мог получить структуру. т.е. dput(head(yourdata))   -  person akrun    schedule 01.02.2021
comment
Обновлено в вопросе, чтобы вам было легче просматривать, внизу. Большое спасибо за вашу помощь, я очень ценю ваши усилия.   -  person Kilian Murphy    schedule 01.02.2021
comment
Извините, это была простая опечатка - я использовал idunique в одном месте, а затем uniqueid в другом. Обновлено. пожалуйста, проверьте это сейчас   -  person akrun    schedule 01.02.2021
comment
Это сработало отлично !!! Спасибо много :)   -  person Kilian Murphy    schedule 01.02.2021
comment
Я думаю, что когда я посмотрел на ваш ожидаемый, он показал uniqueid и каким-то образом я скопировал это имя вместо оригинального   -  person akrun    schedule 01.02.2021
comment
Совершенно не беспокойтесь, цените помощь   -  person Kilian Murphy    schedule 01.02.2021


Ответы (1)


Мы можем перейти к длинному формату с помощью pivot_longer, а затем использовать paste, str_c или sprintf

library(dplyr)
library(tidyr)
library(stringr)
clf %>%
      pivot_longer(cols = -idunique, values_drop_na = TRUE,
           names_to = 'date', values_to = 'value') %>%
      transmute(idunique, cut = sprintf('%s-%02d-15', 
               str_remove(date, '^X'), value))
# A tibble: 1 x 2
#  idunique cut       
#     <int> <chr>     
#1        3 2017-03-15

данные

# OP's dput showed all rows NA.  So, added a value for test
clf$X2017[3] <- 3
person akrun    schedule 01.02.2021
comment
Спасибо за помощь! Я получаю это сообщение об ошибке "Ошибка: проблема с mutate() входом ..1". x Входные данные ..1 не могут быть переработаны до размера 151902. i Входные данные ..1 равны uniqueid. i Введите ..1 должен иметь размер 151902 или 1, а не 3. - person Kilian Murphy; 01.02.2021
comment
Отредактировал там комментарий! - person Kilian Murphy; 01.02.2021
comment
@KilianMurphy Линия df1 %>% pivot_longer(cols = -idunique, values_drop_na = TRUE, names_to = 'date', values_to = 'value') работает без ошибок - person akrun; 01.02.2021
comment
Да, это работает, создает тиббл! Я, очевидно, изменил df1 на имя фрейма данных, но эта строка работает. - person Kilian Murphy; 01.02.2021
comment
Вывод из первой строки: Тибл: 151 902 x 5 X2017 X2016 X2015 значение даты ‹int› ‹int› ‹int› ‹chr› ‹int› 1 NA NA NA idunique 1 - person Kilian Murphy; 01.02.2021
comment
@KilianMurphy, это невозможно. У вас есть имя столбца idunique или это uniqueid. pivot_longer, я указал cols для изменения формы от широкого к длинному, как и все остальные столбцы, кроме idunique. - person akrun; 01.02.2021
comment
Да, см. Фотографию фрейма данных, прикрепленную к вопросу, пожалуйста, 4 столбца, 3 года и уникальный. - person Kilian Murphy; 01.02.2021