В R, в чем разница между df ["x"] и df $ x - PullRequest
18 голосов
/ 30 июля 2010

Где я могу найти информацию о различиях между вызовами столбца в data.frame через:

df <- data.frame(x=1:20,y=letters[1:20],z=20:1)

df$x
df["x"]

Они оба возвращают «одинаковые» результаты, но не обязательно в одном и том же формате. Еще одна вещь, которую я заметил, это то, что df $ x возвращает список. Принимая во внимание, что df ["x"] возвращает data.frame.

РЕДАКТИРОВАТЬ: Однако, зная, какой использовать в какой ситуации стало проблемой. Есть ли здесь лучшая практика или она действительно сводится к пониманию того, что требует команда или функция? До сих пор я только просматривал их, если моя функция сначала не работает (методом проб и ошибок).

Ответы [ 7 ]

16 голосов
/ 30 июля 2010

Другое отличие состоит в том, что df$w возвращает NULL, а df['w'] или df[['w']] выдает ошибку с вашим примером кадра данных.

14 голосов
/ 30 июля 2010

Если я не ошибаюсь, df$x совпадает с df[['x']].[[ используется для выбора любого отдельного элемента, тогда как [ возвращает список выбранных элементов.См. Также справочник по языку .Я обычно вижу, что [[используется для списков, [для массивов и $ для получения одного столбца или элемента.Если вам нужно выражение (например, df [[name]] или df [, name]), используйте также обозначения [или [[Запись [также используется, если выбрано несколько столбцов.Например, df [, c ('name1', 'name2')].Я не думаю, что для этого есть лучшие практики.

9 голосов
/ 30 июля 2010

Помимо страницы индексации в руководстве, вы можете найти это краткое описание на странице справки? "$":

Индексирование по ‘[’ похоже на атомарное векторы и выбирает список указанный элемент (ы).

Оба ‘[[’ и ‘$’) выбирают один элемент списка. Главный Разница в том, что "$" не позволяет вычисленные индексы, тогда как ‘[[’ делает. ‘X $ name’ эквивалентно ‘x [[" name ", точный = ЛОЖЬ]] ’. Кроме того, частичное поведение соответствия of [[’может быть контролируется с помощью «точного» аргумента.

Вызовы функций, конечно, разные. См. get("[.data.frame") против get("[[.data.frame") против get("$")

7 голосов
/ 21 сентября 2010

В этом случае, для большинства случаев, я бы вообще избегал поднабора и пытался вспомнить, что $, [ и [[ делают с фреймом данных. Я бы просто использовал with():

> df <- data.frame(x = 1:20, y = letters[1:20], z = 20:1)
> with(df, y)
 [1] a b c d e f g h i j k l m n o p q r s t
Levels: a b c d e f g h i j k l m n o p q r s t

Это намного яснее, чем любой из методов поднабора в большинстве случаев (ИМХО).

6 голосов
/ 10 января 2011

Одна вещь, которую я не видел в явном виде, заключается в том, что [ и [[ могут использоваться для выбора на основе значения переменной или выражения , в то время как $ не может. Вы можете сделать:

> example_frame <- data.frame(Var1 = c(1,2), Var2 = c('a', 'b'))
> x <- 'Var1'

> example_frame$x
NULL  # Not what you wanted

> example_frame[x]
  Var1
1    1
2    2

> example_frame[[x]]
[1] 1 2

> example_frame[[ paste(c("V","a","r",2), collapse='') ]]
[1] a b
Levels: a b

Различия между [ и [[ хорошо охвачены другими сообщениями и другими вопросами .

5 голосов
/ 30 июля 2010

Если вы используете df [, "x"] вместо df ["x"], вы получите тот же результат, что и df $ x. Запятая указывает, что вы выбираете столбец по имени.

0 голосов
/ 30 июля 2010

df$x и df[[x]] делают одно и то же.

Предположим, что у вас есть набор данных с именем one.Одна из этих переменных - факторная переменная Region.Использование one$Region позволит вам выбрать конкретную переменную.Рассмотрим следующее:

one <- read.csv("IED.csv")
one$Region

Выполнение следующего кода также позволяет изолировать эту переменную / уровень.

one[["Region"]]

Каждый код выдает следующий вывод:

> one$Region
    [1] RC SOUTH      RC SOUTH      RC SOUTH      RC EAST       RC EAST      
    [6] RC EAST       RC EAST       RC EAST       RC EAST       RC EAST      
   [11] RC SOUTH      RC SOUTH      RC EAST       RC EAST       RC EAST      
   [16] RC EAST       RC EAST       RC SOUTH      RC SOUTH      RC EAST      
   [21] RC SOUTH      RC EAST       RC CAPITAL    RC EAST       RC EAST 


> one[["Region"]]
    [1] RC SOUTH      RC SOUTH      RC SOUTH      RC EAST       RC EAST      
    [6] RC EAST       RC EAST       RC EAST       RC EAST       RC EAST      
   [11] RC SOUTH      RC SOUTH      RC EAST       RC EAST       RC EAST      
   [16] RC EAST       RC EAST       RC SOUTH      RC SOUTH      RC EAST      
   [21] RC SOUTH      RC EAST       RC CAPITAL    RC EAST       RC EAST 

«Они оба возвращают« одинаковые »результаты, но не обязательно в одном и том же формате».- Я не заметил никаких отличий.Каждая команда выдает одинаковые результаты в одинаковом формате.Возможно, это ваши данные.

Надеюсь, что это поможет.

РЕДАКТИРОВАТЬ:

Неправильный исходный вопрос.df["x"] выдает следующее:

> one["Region"]
             Region
1          RC SOUTH
2          RC SOUTH
3          RC SOUTH
4           RC EAST
5           RC EAST
6           RC EAST
7           RC EAST
8           RC EAST
9           RC EAST
10          RC EAST

Не уверен, почему возникает разница.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...