在我的研究中,我总是使用“with”而不是“within”,但是我最初认为它们是一样的。刚刚我把“with”错打成“within”,结果返回的结果非常不同。我想知道为什么。
我正在使用plyr
包中的棒球数据,因此首先通过加载库来使用:
require(plyr)
然后,我想选择所有 id 为 "ansonca01" 的行。起初,正如我所说,我使用了 "within" 并执行如下函数:
within(baseball, baseball[id=="ansonca01", ])
我得到了非常奇怪的结果,基本上包括了所有内容:
id year stint team lg g ab r h X2b X3b hr rbi sb cs bb so ibb hbp sh sf gidp
4 ansonca01 1871 1 RC1 25 120 29 39 11 3 0 16 6 2 2 1 NA NA NA NA NA
44 forceda01 1871 1 WS3 32 162 45 45 9 4 0 29 8 0 4 0 NA NA NA NA NA
68 mathebo01 1871 1 FW1 19 89 15 24 3 1 0 10 2 1 2 0 NA NA NA NA NA
99 startjo01 1871 1 NY2 33 161 35 58 5 1 1 34 4 2 3 0 NA NA NA NA NA
102 suttoez01 1871 1 CL1 29 128 35 45 3 7 3 23 3 1 1 0 NA NA NA NA NA
106 whitede01 1871 1 CL1 29 146 40 47 6 5 1 21 2 2 4 1 NA NA NA NA NA
113 yorkto01 1871 1 TRO 29 145 36 37 5 7 2 23 2 2 9 1 NA NA NA NA NA
.........
然后我使用“with”代替“within”。
with(baseball, baseball[id=="ansonca01",])
并且获得了我期望的结果
id year stint team lg g ab r h X2b X3b hr rbi sb cs bb so ibb hbp sh sf gidp
4 ansonca01 1871 1 RC1 25 120 29 39 11 3 0 16 6 2 2 1 NA NA NA NA NA
121 ansonca01 1872 1 PH1 46 217 60 90 10 7 0 50 6 6 16 3 NA NA NA NA NA
276 ansonca01 1873 1 PH1 52 254 53 101 9 2 0 36 0 2 5 1 NA NA NA NA NA
398 ansonca01 1874 1 PH1 55 259 51 87 8 3 0 37 6 0 4 1 NA NA NA NA NA
525 ansonca01 1875 1 PH1 69 326 84 106 15 3 0 58 11 6 4 2 NA NA NA NA NA
我在R环境中输入help(with)
查看了with和within的文档,并得到以下信息:
with是一个通用函数,它在从数据构建的本地环境中评估表达式expr。该环境具有调用者的环境作为其父级。这对于简化对建模函数的调用非常有用。(注意:如果数据已经是一个环境,则使用其现有的父级。)
请注意,expr内部的赋值发生在构造环境中而不是用户的工作区。
within类似,但它会在评估expr后检查环境并对数据进行相应修改(如果创建了无法存储在数据帧中的对象,则数据帧情况下可能会失败),并返回它。 within可用作transform的替代方法。
根据这些差异的说明,我不明白为什么我使用这样一个简单的操作却获得了不同的结果。有人有想法吗?
with
:with(baseball,baseball[id=="ansonca01",])
?你只需要使用baseball[baseball$id=="ansonca01",]
。 - Thomaswithin
返回完整的数据框。在within
内部进行提取并没有什么意义。尝试在with
和within
内部创建一个新变量,你会更清楚地看到差异。 - Thomassubset(baseball, id=="ansonca01")
。 - baptiste