Преобразование данных для использования lubridate на нем - PullRequest
2 голосов
/ 14 мая 2019

Во-первых, спасибо за ваш ответ на другие посты, это мне очень помогло.Вот мой первый.

У меня есть такие данные:

 [1] 1986.05 1986.06 1986.07 1986.08 1986.09 1986.10 1986.11 1986.12 1987.01 1987.02 1987.03 1987.04 1987.05 1987.06

Я хотел бы преобразовать их в

 [1] 1986-05 1986-06 1986-07 1986-08 1986-09 1986-10 1986-11 1986-12 1987-01 1987-02 1987-03 1987-04 1987-05 1987-06

Я пытался использовать gsub() или вставить my data + "-01', но здесь есть проблема: он преобразует мои данные в символ один: 1986.10 становится 1986-1.

Это должен быть месяц, поэтому .10 отличается от .1.

Я не могу действительно объяснить, как мне удается быть в ситуации ТАТ, но теперь я действительно хочу знать, как преобразовать это непосредственно из R!(Было бы проще в Excel)

Спасибо!


РЕДАКТИРОВАТЬ:

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

Проблема в том, что большинство методов преобразуют столбец из числа в символ.

В результате 1986.10 [октябрь 1986] стал 1986.1 [январь 1986].Кажется, что значение символа не может иметь «0» в конце.Но важно сохранить это ...

Ответы [ 2 ]

6 голосов
/ 14 мая 2019

Предполагая, что это Year.month, есть несколько способов сделать это.Преобразуйте его в класс yearmon (из zoo), а затем измените format

library(zoo)
format(as.yearmon(as.character(v1), format = "%Y.%m"), "%Y-%m")  
#[1] "1986-05" "1986-06" "1986-07"

. Или это можно сделать, заменив . на -, используя sub

sub(".", "-", v1, fixed = TRUE)
#[1] "1986-05" "1986-06" "1986-07"

Если значение является числовым, и оно не сможет различить 1986.1 и 1986.10.Один из вариантов - прочитать символьный вектор / столбец ('v2') и затем обработать его

format(as.yearmon(v2, format = "%Y.%m"), "%Y-%m")
#[1] "1986-01" "1986-10" "1986-05"

data

v1 <- c(1986.05, 1986.06, 1986.07)
v2 <- scan(text = "1986.1,1986.10,1986.5", what = "", sep=",", quiet = TRUE)
1 голос
/ 14 мая 2019
data have;
format year_mon_decimal_number 7.2; 
input year_mon_decimal_number @@; datalines;
1986.05 1986.06 1986.07 1986.08 1986.09 1986.10 1986.11 1986.12 1987.01 1987.02 1987.03 1987.04 1987.05 1987.06
run;

data want;
  set have;
  date = input (put(year_mon_decimal_number*100,6.), yymmn6.); 
  format date yymmd7.;
run;
...