2013-12-17 2 views
1

Я манипулирую данными, содержащими даты, и у меня проблемы. По сути, я хочу рассчитать новую дату на основе двух существующих дат и другой переменной для всех строк в моем фреймворке. Например, я хотел бы иметь возможность вычитать 10 дней из Date1 или рассчитать дату, расположенную на полпути между Date1 и Date2 и т. Д. Однако мне сложно понять назначение класса при добавлении новой расчетной даты в фреймворк данных. Образец dataframe:Сложность, выполняющая арифметику с датами в R

# Uncomment to clear your session... 
# rm(list = ls(all = TRUE)) 
tC <- textConnection("StudyID Date1 Date2 
C0031 2-May-09 12-Jan-10 
C0032 7-May-09 30-Apr-10") 
data <- read.table(header=TRUE, tC) 
close.connection(tC) 
rm(tC) 

#CONVERTING TO DATES  
data$Date1 <- with(data,as.Date(Date1,format="%d-%b-%y")) 
data$Date2 <- with(data,as.Date(Date2,format="%d-%b-%y")) 

Теперь вот где моя проблема начинается

class(data[1, "Date2"] - 10) # class is "Date". So far so good. 
data[1, "newdate"] <- (data[1, "Date2"] - 10) 
class(data[1, "newdate"]) # class is now "numeric"... 

И попытался

data[1, "newdate"] <- as.Date(data[1, "Date2"] - 10) 
class(data[1, "newdate"]) # doesn't help. Class still "numeric"... 

Просто не понимая, почему это значение становится числовым при присвоении данных

+0

Вы пробовали 'данные $ newdate <- данные $ Date1 - 10'? Я думаю, что проблема заключается в утилизации одного значения. Поскольку столбцы должны иметь одинаковую длину, ваше уникальное значение даты перерабатывается в соответствие количеству строк в вашем файле data.frame. Я предполагаю (я проверю), что атрибуты полосы рециркуляции, таким образом, превращают даты в их числовые формы. –

ответ

0

Проблема заключается в утилизации ваших атрибутов обжатия вектора. Как я сказал в своем комментарии, используйте, например, data$newdate <- data$Date1 - 10, чтобы создать целую колонку без рециркуляции вектора, сохраняя при этом такие атрибуты, как Date. Рассмотрим иллюстративный пример игрушечный ниже:

# Simple vector with an attribute 
x <- 1:3 
attributes(x) <- list(att = "some attributes") 
x 
#[1] 1 2 3 
#attr(,"att") 
#[1] "some attributes" 

# Simple data.frame with 3 rows 
df <- data.frame(a = 1:3) 

# New column using first element of vector with attributes 
df$b <- x[1] 

# It is recycled to correct number of rows and attributes are stripped 
str(df$b) 
# int [1:3] 1 1 1 

# Without recycling attributes are retained 
df$c <- x 
str(df$c) 
# atomic [1:3] 1 2 3 
# - attr(*, "att")= chr "some attributes" 

# But they all look the same... 
df 
# a b c 
#1 1 1 1 
#2 2 1 2 
#3 3 1 3 

А из ваших данных ..

attributes(data$Date1) 
# $class 
# [1] "Date" 
+1

Спасибо за эти два замечательных ответа, один практический, а другой - анализ основного поведения. Очень ценится и теперь отклеивается! – marcel

2

проблема связана с отсутствием колонки newdate в сочетании с остроумием ч назначая одно значение:

# create a single value in a new column 
data[1, "newdate"] <- data[1, "Date2"] - 10 
class(data[1, "newdate"]) # numeric 

# create the whole column 
data[ , "newdate2"] <- data[1, "Date2"] - 10 
class(data[1, "newdate2"]) # Date 

# create a column of class Date before assigning value 
data[ , "newdate3"] <- as.Date(NA) 
data[1, "newdate3"] <- data[1, "Date2"] - 10 
class(data[1, "newdate3"]) # Date 

Кстати, вам не нужно as.Date при выполнении математических операций с Date объектами.

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