过滤数据,逗号与不逗号

Filtering data, comma vs not comma

我有以下代码

#abnormal return 
exp.ret <- lm((RET-rf)~mkt.rf+smb+hml, data=tesla[tesla$period=="estimation.period",])
tesla$abn.ret <- (tesla$RET-tesla$rf)-predict(exp.ret,tesla)

#CAR during event window
CAR <- sum(tesla$abn.ret[tesla$period=="event.period",])

第一部分运行正常,但第二部分出现此错误:

"Error in tesla$abn.ret[tesla$period == "event.period", ] : incorrect number of dimensions

我知道解决办法是去掉最后一个逗号:

  #CAR during event window
    CAR <- sum(tesla$abn.ret[tesla$period=="event.period"])

只是想知道理解它的正确教学方法是什么,为什么在某些情况下我最后需要一个逗号,而在某些情况下当我只过滤部分数据框时不需要逗号。

tesla$abn.ret 是 one-dimensional。每个逗号分隔一个维度,因此您的逗号表示 2 个维度。

或者你可以运行

tesla[tesla$period=="event.period", "abn.ret"]

得到相同的结果,因为特斯拉是二维的。

如果您使用命令 ?'[' 查看文档,您会发现语法 x[i] 的默认行为是删除一维。

如果你想禁用删除维度,你必须明确地写 x[i,drop=False]

$符号,[[]][]意义不同

简而言之:

  • $ 符号和 [[]] 子集 数据框的一列 或列表的 一项
    • 子集数据帧的输出将是一个向量,而子集列表的输出将是一个与原始项目相同 class 的变量,可以是数据帧、另一个列表等。 ..
    • 重要的是要注意 $ 不接受列索引(仅列名)并且您不能在 $ 之后或 [= 内部插入两列 names/index 12=].
  • [] 对数据帧或列表进行切片,整理出 一个或多个 元素。
    • 输出变量的class将与原始变量相同
    • 如果您使用 [] 对数据帧进行切片,输出将是一个数据帧,这同样适用于列表等...

在您的特定情况下,您使用 $ 符号对变量进行子集化。然后,您尝试使用 [ , ] 从子集操作中切分此输出,但结果是输出是一个向量,而 一个向量始终只有一维 和一个错误被解雇。您应该使用 [](输出将是一个向量)或 [[]](输出将是一个带有 length = 1 的向量)对向量进行切片。

根据需要对 tesla 进行子集化的可能方法:

tesla$abn.ret[tesla$period == "event.period"]
tesla[["abn.ret"]][tesla$period == "event.period"]
tesla[tesla$period == "event.period", "abn.ret"]

使用 tesla[["period"]] 而不是 tesla$period 可以获得相同的结果。

一些额外的 details/examples,请参阅 An introduction to R,由 CRAN 发布。

希望对您有所帮助..!