Зачем R нужно имя кадра данных? - PullRequest
3 голосов
/ 07 февраля 2012

Если у вас есть такой фрейм данных

mydf <- data.frame(firstcol = c(1,2,1), secondcol = c(3,4,5))

С чего бы

mydf[mydf$firstcol,]

работает, но

mydf[firstcol,]

не будет?

Ответы [ 2 ]

10 голосов
/ 07 февраля 2012

Вы можете сделать это:

mydf[,"firstcol"]

Помните, что столбец идет вторым, а не первым.

В вашем примере, чтобы увидеть, что дает mydf[mydf$firstcol,], давайте разберем его:

> mydf$firstcol
[1] 1 2 1

То есть, на самом деле mydf[mydf$firstcol,] совпадает с

> mydf[c(1,2,1),]
    firstcol secondcol
1          1         3
2          2         4
1.1        1         3

Итак, вы запрашиваете строки 1, 2 и 1. То есть вы запрашиваете строкуодин будет таким же, как строка 1 в mydf, ваш 2-й будет таким же, как строка 2 в mydf, а ваш 3-й будет таким же, как строка 1 в mydf;и вы запрашиваете оба столбца.

Другой вопрос: почему не работает следующее:

> mydf[,firstcol]
Error in `[.data.frame`(mydf, , firstcol) : object 'firstcol' not found

То есть, почему вы должны ставить кавычки вокруг имени столбца, когда выпросите об этом, но не тогда, когда вы делаете mydf$firstcol.Ответ прост: используемые вами операторы требуют аргументов разных типов.Вы можете посмотреть '$', чтобы увидеть форму x $ name, и, таким образом, вторым аргументом может быть имя, которое не заключено в кавычки.Затем вы можете посмотреть ?'[', что фактически приведет вас к той же странице справки.И там вы найдете следующее, что объясняет это.Обратите внимание, что в «символьном» векторе должны быть записи в кавычках (именно так вы вводите символьный вектор в R (и во многих других языках).

i, j, ...: indices specifying elements to extract or replace.  Indices
      are ‘numeric’ or ‘character’ vectors or empty (missing) or
      ‘NULL’.  Numeric values are coerced to integer as by
      ‘as.integer’ (and hence truncated towards zero).  Character
      vectors will be matched to the ‘names’ of the object (or for
      matrices/arrays, the ‘dimnames’): see ‘Character indices’
      below for further details.
2 голосов
/ 07 февраля 2012

Нечего добавить к очень ясному объяснению Сюй Вана.Вы можете также отметить, что пакет data.table позволяет использовать нотации, такие как mydf[firstcol==1,] или mydf[,firstcol], которые многие находят более естественными.

...