在尝试将我的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
我现在正在以完全不同的方式进行这种分析,但我发现这种行为上的差异真的很令人痛苦,如果有人能够解释它为什么会发生,我将非常感激。
谢谢!
答案 0 :(得分: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"