Schwierigkeit, Arithmetik mit Daten in R durchzuführen

Ich manipuliere Daten, die Daten enthalten, und habe ein bisschen Ärger. Im Wesentlichen möchte ich ein neues Datum basierend auf zwei vorhandenen Daten und einer anderen Variablen für alle Zeilen in meinem Datenrahmen berechnen. Ich möchte zum Beispiel 10 Tage von Date1 subtrahieren oder das Datum berechnen, das in der Mitte zwischen Date1 und Date2 liegt. Ich habe jedoch Schwierigkeiten, die Klassenzuweisung zu verstehen, wenn ich das neue berechnete Datum dem Datenrahmen hinzufüge. Beispieldatenrahmen:

#  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"))

Hier beginnt mein Problem

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"... 

Und versucht

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

Ich verstehe einfach nicht, warum dieser Wert numerisch wird, wenn er Daten zugewiesen wird

0
Haben Sie versucht, data $ newdate <- data $ Date1 - 10 ? Ich denke, das Problem ist das Recycling eines einzelnen Wertes. Da Spalten die gleiche Länge haben müssen, wird Ihr einzelner Datumswert wieder in die Anzahl der Zeilen in Ihrem data.frame konvertiert. Ich gehe davon aus (ich überprüfe), dass die Recycling-Streifenattribute Daten in ihre numerischen Formen umwandeln.
hinzugefügt der Autor Simon O'Hanlon, Quelle

2 Antworten

The problem is due to recycling of your vector stripping attributes. As I stated in my comment, use e.g. data$newdate <- data$Date1 - 10 to create the whole column without recycling the vector, thus retaining attributes such as Date. Consider the illustrative toy example below:

# 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

Und von deinen Daten ..

attributes(data$Date1)
# $class
# [1] "Date"
0
hinzugefügt
Danke für diese zwei großartigen Antworten, die eine ist praktisch und die andere seziert das zugrunde liegende Verhalten. Sehr geschätzt und jetzt abgelöst!
hinzugefügt der Autor marcel, Quelle

Das Problem ist auf das Nichtvorhandensein der Spalte newdate in Kombination mit der Zuweisung eines einzelnen Werts zurückzuführen:

# 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

Übrigens brauchen Sie as.Date nicht, wenn Sie mathematische Operationen mit Date -Objekten durchführen.

0
hinzugefügt