2017-07-06 76 views
1

雖然努力的我data.frame一列從字符串到日期對象轉換我有一個相當可怕的警告消息一起收到了意想不到的結果:

my_dataframe <- data.frame(date = c("20070610", "20170611")) 
my_dataframe["date"] <- strptime(my_dataframe$date, format = "%Y%m%d") 

# Warning message: 
# In `[<-.data.frame`(`*tmp*`, "date", value = list(sec = c(NA_real_, : 
# provided 11 variables to replace 1 variables 

my_dataframe 

# my_dataframe 
# date 
# 1 0 
# 2 0 

但是,如果我只是一個$<-.data.frame操作我更換[<-.data.frame操作收到我想要的結果,我不警告的任何問題:

my_dataframe <- data.frame(date = c("20070610", "20170611")) 
my_dataframe$date <- strptime(my_dataframe$date, format = "%Y%m%d") 
my_dataframe 

# my_dataframe 
#  date 
# 1 20070610 
# 2 20170611 

我現在做這種分析在一個完全不同的方式,但我覺得這種行爲差異實在令人痛心,並會如果有人湊真的很感激ld解釋它爲什麼會發生。

謝謝!

+1

什麼是my_dataframe_1?這是一個錯字還是你在一個不同的數據框? – Marius

+0

你有沒有學過幫助(「[」)? – Roland

+0

我發現'help(「[。data.frame」)'更有用。 –

回答

3

[.data.frame$.data.frame是不同的,因爲[返回一個數據幀(列表)和$返回一個向量。相當於$的支架是[[,並且按預期工作。您也可以將您分配的內容包裝在list()中,以確保它被識別爲單個列。

my_dataframe <- data.frame(date = c("20070610", "20170611")) 
my_dataframe["date2"] <- strptime(my_dataframe$date, format = "%Y%m%d") 
my_dataframe[["date3"]] <- strptime(my_dataframe$date, format = "%Y%m%d") 
my_dataframe$date4 <- strptime(my_dataframe$date, format = "%Y%m%d") 
my_dataframe["date5"] <- list(strptime(my_dataframe$date, format = "%Y%m%d")) 
my_dataframe 
#  date date2  date3  date4  date5 
# 1 20070610  0 2007-06-10 2007-06-10 2007-06-10 
# 2 20170611  0 2017-06-11 2017-06-11 2017-06-11 

# [[<-, $<-, and [<- list() all work fine 

在這種情況下,我認爲這是POSIX類對象的額外屬性混淆了事情。一般來說,最好的做法是在知道有一列時使用[[

x = strptime(my_dataframe$date, format = "%Y%m%d") 
attributes(x) 
# $names 
# [1] "sec" "min" "hour" "mday" "mon" "year" "wday" "yday" "isdst" "zone" 
# [11] "gmtoff" 
# 
# $class 
# [1] "POSIXlt" "POSIXt"