41

Вопрос по dataframe, r – undefined

Предположим, что у нас есть фрейм данныхx который содержит столбцыjob а такжеincome, Для обращения к данным в кадре обычно требуются командыx$jobдля данных вjob столбец иx$income для данных вincome колонка.

Однако, используя командуattach(x) позволяет покончить с именем фрейма данных и тому$ символ при обращении к тем же данным. Как следствие,x$job становитсяjob а такжеx$income становитсяincome в коде R

Проблема состоит в том, что многие эксперты в R советуют НЕ использоватьattach() команда при кодировании в R.

Какова главная причина этого? Что следует использовать вместо этого?

  • Error: User Rate Limit ExceededwithError: User Rate Limit Exceededattach.

    от
  • Error: User Rate Limit Exceededdata=Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Одна проблема заключается в том, что у вас могут быть другие объекты в памяти, называемые (в вашем примере)job, или жеincome, Если вы хотите использовать их, но естьattach()кадр данныхxлегко перемешать использование объектовx$job а такжеjob, или жеx$income а такжеincome.

    от guest
  • 39

    When to use it:

    я используюattach() когда мне нужна среда, вы получаете в большинстве пакетов статистики (например, Stata, SPSS) работу с одним прямоугольным набором данных за раз.

    When not to use it:

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

    with() функция илиdata= аргумент для многих функций, являются отличными альтернативами для многих случаев, когдаattach() заманчиво

  • 13

    Я думаю, что нет ничего плохого в использовании

    attach, Я сам им не пользуюсь (опять же, я люблю животных, но тоже не держу их). Когда я думаю оattachДумаю на длительный срок. Конечно, когда я работаю со сценарием, я знаю его изнутри и снаружи. Но через неделю, месяц или год, когда я возвращаюсь к сценарию, я нахожу накладные расходы на поиск источника определенной переменной, слишком дорогой. Многие методы имеютdata аргумент, который делает вызов переменных довольно простым (Sensulm(x ~ y + z, data = mydata)). Если нет, я нахожу использованиеwith к моему удовлетворению.

    Короче говоря, в моей книге метод attach подходит для короткого и быстрого исследования данных, но для разработки сценариев, которые я или другие могли бы использовать, я стараюсь сделать свой код максимально читабельным (и переносимым).

  • 9

    Если вы выполните

    attach(data) несколько раз, например, 5 раз, то вы можете увидеть (с помощьюsearch()) что ваши данные были прикреплены 5 раз в рабочей среде. Так что если вы отключите (detach(data)) однажды, все еще будетdata присутствует 4 раза в окружающей среде. Следовательно,with()/within() лучшие варианты. Они помогают создать локальную среду, содержащую этот объект, и вы можете использовать ее, не создавая путаницы.

  • 21

    Еще одна причина не использовать

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

    > head(cars)
      speed dist
    1     4    2
    2     4   10
    3     7    4
    4     7   22
    5     8   16
    6     9   10
    > attach(cars)
    > # convert stopping distance to meters
    > dist <- 0.3048 * dist
    > # convert speed to meters per second
    > speed <- 0.44707 * speed
    > # compute a meaningless time
    > time <- dist / speed
    > # check our work
    > head(cars)
      speed dist
    1     4    2
    2     4   10
    3     7    4
    4     7   22
    5     8   16
    6     9   10
    

    Изменений вcars набор данных, хотяdist а такжеspeed были назначены на.

    Если явно назначен обратно на набор данных ...

    > head(cars)
      speed dist
    1     4    2
    2     4   10
    3     7    4
    4     7   22
    5     8   16
    6     9   10
    > attach(cars)
    > # convert stopping distance to meters
    > cars$dist <- 0.3048 * dist
    > # convert speed to meters per second
    > cars$speed <- 0.44707 * speed
    > # compute a meaningless time
    > cars$time <- dist / speed
    > # compute meaningless time being explicit about using values in cars
    > cars$time2 <- cars$dist / cars$speed
    > # check our work
    > head(cars)
        speed   dist      time     time2
    1 1.78828 0.6096 0.5000000 0.3408862
    2 1.78828 3.0480 2.5000000 1.7044311
    3 3.12949 1.2192 0.5714286 0.3895842
    4 3.12949 6.7056 3.1428571 2.1427133
    5 3.57656 4.8768 2.0000000 1.3635449
    6 4.02363 3.0480 1.1111111 0.7575249
    

    dist а такжеspeed которые упоминаются в вычисленияхtime исходные (нетрансформированные) значения; значенияcars$dist а такжеcars$speed когдаcars был прикреплен