过滤数据,逗号与不逗号
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 发布。
希望对您有所帮助..!
我有以下代码
#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 发布。
希望对您有所帮助..!