2014-02-17 5 views
6

Я всегда использую «с» вместо «внутри» в контексте моих исследований, но изначально я думал, что они одинаковы. Только сейчас я ошибаюсь «с» для «внутри», и полученные результаты совершенно разные. Мне интересно, почему?В чем разница между и внутри R?

Я использую данные бейсбол в plyr пакет, поэтому я сначала загрузить библиотеку

require(plyr) 

Затем я хочу, чтобы выбрать все строки с идентификатором «ansonca01». Во-первых, как я уже сказал, я использовал «в», и запустить функцию следующим образом:

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(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 

Я проверил документацию с и в набрав help(with) в среде R, и получил следующее:

с является общей функцией, которая оценивает выраж в локальная среда, построенная из данных. Окружающая среда имеет окружение вызывающего абонента в качестве родителя. Это полезно для упрощения вызовов функций моделирования. (Примечание: если данные уже являются средой, то это используется с существующим родителем.)

Обратите внимание, что назначения в expr выполняются в сконструированной среде, а не в рабочей области пользователя.

Внутри аналогично, за исключением того, что он исследует среду после оценки expr и вносит соответствующие изменения в данные (это может привести к сбою в случае фрейма данных, если объекты созданы, которые не могут быть сохранены в кадре данных) и возвращает его. внутри может быть использовано в качестве альтернативы преобразованию.

Из этого объяснения различий я не понимаю, почему я получил разные результаты при такой простой операции. У кого-нибудь есть идеи?

+4

Почему вы используете 'with' вообще в инструкции вроде:' с (бейсбол, бейсбол [id == "ansonca01",]) '? Вам просто нужно «бейсбол [бейсбол $ id ==» ansonca01 »,]'. – Thomas

+0

'in' возвращает полный фрейм данных. Выполнение извлечения внутри 'inside' на самом деле не имеет никакого смысла. Попробуйте создать новую переменную внутри 'с' и внутри' внутри', и вы увидите разницу более четко. – Thomas

+0

@Thomas Привет, конечно, я знаю, что могу делать подмножество с бейсболом [baseball $ id == "ansonca01",], и на самом деле я всегда делал это таким образом. Сегодня я просто хотел попробовать что-то другое, и я нашел с ними и в результате разные результаты для такой простой операции. Я хочу понять, почему !!! Я узнал, что «внутри» предназначен для создания новых переменных, но это не отвечает на мой вопрос, размещенный здесь, поэтому эти две функции приводят к различным результатам в подмножестве? – nan

ответ

6

documentation довольно четкое представление о семантике и возвращаемые значения (и хорошо соответствует повседневному значению слов «с» и «внутри»):

Значение:

Для ' with ', значение оцененного «expr». Для 'within', объект .

Поскольку ваш код ничего не изменяет в baseball неизмененный baseball возвращается.with, с другой стороны, не возвращает объект, он возвращает expr.

Вот пример, где expr ession изменяет объект:

> head(within(cars, speed[dist < 20] <- 1)) 
speed dist 
1  1 2 
2  1 10 
3  1 4 
4  7 22 
5  1 16 
6  1 10 
+0

Я думаю, что это ответ на мой вопрос. на самом деле прочитал контент, который вы «цитировали» из документации, но я не полностью понял это предложение (For «with», значение оцененного «expr». Для «внутри», измененного объекта), когда я его прочитал. Ваше объяснение помогает мне переосмыслить его, и это имеет смысл. Теперь я понять, что «с» возвращает результат для выражения. Для «внутри», если вы ничего не модифицируете, возвращается исходный объект. Благодаря! – nan

+0

Можете ли вы рассказать, как r проверяет, изменяется ли объект в случае 'внутри', проверяя наличие' <-'? – SIslam

+0

@SIslam Это не * проверка * это. Он просто оценивает выражение, которое вы передаете через 'inside', и выполняет оценку внутри фрейма данных. –

12

Я нахожу простые примеры часто работают, чтобы подчеркнуть разницу. Что-то вроде:

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 
Смежные вопросы