Как заменить столбец в R?странное поведение с датами

StackOverflow https://stackoverflow.com/questions/3210841

  •  13-09-2020
  •  | 
  •  

Вопрос

Я пытаюсь преобразовать необычный формат даты в стандартную дату.По сути, у меня есть набор данных, содержащий период с полугодовой частотой, отформатированный следующим образом:206 обозначает вторую половину 2006 года, 106 обозначает первую половину и так далее.Чтобы переставить его на 01.06.2006 или 01.01.2006, я написал небольшую функцию:

period2date = function(period)
{
check=list()
check=strsplit(as.character(period),split="")
x=as.numeric(check[[1]][1])
p=ifelse( x >= 2,6,1)
x=2

out=paste(x,"0",check[[1]][2],check[[1]][3],"-",p,"-1",sep="")
out=as.Date(out)


return(out)    
}

теперь вы можете смеяться :) .В любом случае, эта функция работает, и здесь возникает проблема.Я хочу применить эту функцию к столбцу времени data.frame.Я попробовал следующее:

as.data.frame(lapply(mydf$period,period2date)) 

который вернул результат, наиболее близкий к тому, что я хочу:структура.13665..класс....Дата..1 01.06.2006

и так далее..очевидно, мне бы хотелось сохранить название моего столбца — или, что еще лучше, просто добавить дату в новом формате к исходному файлу df.Плюс я попробовал:

sapply(mydf$period,period2date) # with results equal to the line below
unlist(lapply(mydf$period,period2date))

[1] 13300 13514 13665

Все, что я хочу сделать, это изменить необычный 206 и т. д.отформатируйте до 2006-06-01 (который работает) и добавьте столбец в mydf (который не работает)

заранее спасибо за любые предложения!

Это было полезно?

Решение

R хранит даты в виде чисел, поэтому я думаю, что у вас какое-то странное поведение, потому что вы работаете с выводом даты (т. е. помещаете даты обратно в матрицу, что заставляет их выглядеть как числа, которыми они являются на самом деле).Вместо этого вам следует явно использовать data.frame с data.frame().Кроме того, вы можете сэкономить некоторое время, если будете использовать векторизованные операции (я думаю, что apply семья все еще использует циклы):

period2date <- function(period) {
    period <- as.character(period)
    half <- substr(period, 1, 1)
    year <- substr(period, 2, 3)
    dates <- as.Date(ifelse(half=="1", paste(year, "0101", sep=""), paste(year, "0701", sep="")), format="%y%m%d")
    return(dates)
}

data <- data.frame(data, period2date(data$dates))

Вы можете сделать это более чистым, заменив пороки, добавив также столбец периода/даты.

Другие советы

Это странно ...:

as.Date(sapply(mydf$period,period2date))
.

Возвращает "2006-06-01" "2006-06-01" "2006-01-01" и т. Д. Я ошеломлен, потому что функция Progist2Date уже содержит AS.date ().Это решение моей проблемы, но я полностью не понимаю ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top