在R中,为什么[< - 。data.frame`和`$< - .data.frame`表现不同?

时间:2017-07-06 04:57:47

标签: r dataframe statistics

在尝试将我的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

我现在正在以完全不同的方式进行这种分析,但我发现这种行为上的差异真的很令人痛苦,如果有人能够解释它为什么会发生,我将非常感激。

谢谢!

1 个答案:

答案 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"