在阅读data.table
常见问题解答(第1.5节)后,我的印象是所有三种寻址方式都或多或少相同。但至少[, mycol, with=FALSE]
的输出与$mycol
和[[mycol]]
完全不同:
dt1 <- fread(
" id,colA,colB
id1,3,xxx
id2,0,zzz
id3,NA,yyy
id4,0,aaa
")
dt1$colA <- factor(dt1$colA)
myvar="colA"
dt1$colA
# [1] 3 0 <NA> 0
# Levels: 0 3
dt1[[myvar]]
# [1] 3 0 <NA> 0
# Levels: 0 3
dt1[, myvar, with=FALSE]
# colA
# 1: 3
# 2: 0
# 3: NA
# 4: 0
那么,这三种方法之间的确切区别是什么?我可以假设$mycol
和[[mycol]]
始终相同吗?为什么[, mycol, with=FALSE]
&#34;失去&#34;因素是什么?
提前致谢。
答案 0 :(得分:3)
问题的第一部分,$
和[[
之间的差异,已在this question中介绍过:
按
[
索引与原子向量类似,并选择一个列表 指定的元素。
[[
和$
都会选择列表中的单个元素。主要的 差异是$
不允许计算索引,而[[
确实。x$name
相当于x[["name", exact = FALSE]]
。也,[[
的部分匹配行为可以使用exact
论证。
dt1[, myvar, with=FALSE]
中的符号data.table
会生成一个数据表,其中包含在myvar
中评估的列。结果是一列数据表,该列的类为factor
。
等效的数据框将是:as.data.frame(dt1)[, myvar, drop = FALSE]
。