在我的研究背景下,我总是使用"with"而不是"within",但我原本以为它们是相同的.刚才我错误地将"with"改为"within"并且返回的结果完全不同.我想知道为什么?
我正在使用plyr包中的棒球数据,所以我首先加载库
require(plyr)
Run Code Online (Sandbox Code Playgroud)
然后,我想选择ID为" ansonca01 "的所有行.首先,正如我所说,我使用" 内部 ",并运行如下函数:
within(baseball, baseball[id=="ansonca01", ])
Run Code Online (Sandbox Code Playgroud)
我得到了非常奇怪的结果,基本上包括一切:
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
.........
Run Code Online (Sandbox Code Playgroud)
然后我使用" with "而不是" within ",
with(baseball, baseball[id=="ansonca01",])
Run Code Online (Sandbox Code Playgroud)
并得到了我期望的结果
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
Run Code Online (Sandbox Code Playgroud)
我通过键入help(with)R环境检查了with和within的文档,并得到以下内容:
with是一个泛型函数,用于在由数据构造的本地环境中计算expr.环境将调用者的环境作为其父级.这对于简化对建模函数的调用很有用.(注意:如果数据已经是一个环境,那么它将与其现有父级一起使用.)
请注意,expr中的赋值发生在构造的环境中,而不是在用户的工作区中.
内部类似,只是它在评估expr之后检查环境并对数据进行相应的修改(如果创建了无法存储在数据框中的对象,则可能在数据框情况下失败),并返回它.内部可以用作变换的替代方案.
从这种差异的解释,我不明白为什么我用这么简单的操作得到了不同的结果.有人有想法吗?
the*_*ail 16
我发现简单的例子经常起到突出作用的作用.就像是:
df <- data.frame(a=1:5,b=2:6)
df
a b
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6
with(df, {c <- a + b; df;} )
a b
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6
within(df, {c <- a + b; df;} )
# equivalent to: within(df, c <- a + b)
# i've just made the return of df explicit
# for comparison's sake
a b c
1 1 2 3
2 2 3 5
3 3 4 7
4 4 5 9
5 5 6 11
Run Code Online (Sandbox Code Playgroud)
Kon*_*lph 11
该文件是关于语义和返回值相当清楚(和很好的话,每天的意义"与"相匹配,"以内"):
值:
对于'
with',评估的值'expr'.对于'within',修改后的对象.
由于您的代码不会修改任何内部baseball,因此baseball返回未修改的代码.with另一方面,不返回对象,它返回expr.
这是expression修改对象的示例:
> head(within(cars, speed[dist < 20] <- 1))
Run Code Online (Sandbox Code Playgroud)
speed dist
1 1 2
2 1 10
3 1 4
4 7 22
5 1 16
6 1 10
Run Code Online (Sandbox Code Playgroud)