因此,我在名为mc_split_device
的数据表中创建了名为mc_with_devices
的变量。但是,如果我键入mc_with_devices$mc_split
,则会得到列mc_split_device
的值,而我从未创建任何名称为mc_split
的变量。
答案 0 :(得分:4)
请参见Hadley Wickham's Advanced R:
$是简写运算符,其中x $ y等于x [[“ y”,确切= FALSE]]。它通常用于访问数据框中的变量,例如mtcars $ cyl或diamonds $ carat。
所以exact=FALSE
是$mc_split
起作用的原因,尽管没有确切名称的列。
顺便说一句,我相信mc_with_devices[,.(mc_split)]
不能在没有双引号的情况下工作。以下将起作用:
mc_with_devices[,"mc_split_resp"]
答案 1 :(得分:3)
它部分匹配列的名称。来自?Extract
名称:对于提取,通常与对象名称部分匹配(请参见“环境”下的内容)。
在某些情况下,字符索引可以部分匹配(请参阅pmatch)与被子集对象的名称或暗名
因此,默认行为是仅在通过$从递归对象(环境除外)中提取时使用部分匹配。
因此,当您这样做
mtcars$m
你得到
#[1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4
#[17] 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4
与mtcars$mpg
有时可能会造成混淆,并且如果您希望确保在完成部分匹配时收到通知。您可以通过以下方式打开警告
options(warnPartialMatchDollar = TRUE)
mtcars$m
# [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4
#[17] 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4
警告信息: 在
$.data.frame
(mtcars,m)中:数据帧中“ m”与“ mpg”的部分匹配
答案 2 :(得分:0)
根据?Extract
name-文字字符串或名称(可能用反引号引起来)。对于提取,通常这与对象名称部分匹配(请参见“环境”下的内容)。
和exact
exact-控制[[通过字符向量提取时可能的部分匹配(对于大多数对象,请参见“环境”下的内容)。默认为不部分匹配。值NA允许部分匹配,但在发生部分匹配时发出警告。值为FALSE允许部分匹配,而不会发出任何警告。
所以,当我们这样做
mtcars$m
#[1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3
#[27] 26.0 30.4 15.8 19.7 15.0 21.4
mtcars$d
#NULL
因为有多个以“ d”开头的名称
names(mtcars)
#[1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb"
如果具体的话,它会对“ disp”列进行部分匹配
mtcars$di
#[1] 160.0 160.0 108.0 258.0 360.0 225.0 360.0 146.7 140.8 167.6 167.6 275.8 275.8 275.8 472.0 460.0 440.0 78.7 75.7 71.1 120.1
#[22] 318.0 304.0 350.0 400.0 79.0 120.3 95.1 351.0 145.0 301.0 121.0