Подтвердить что ты не робот

В R, В чем разница между df [ "x" ] и df $x

Где я могу найти информацию о различиях между вызовами в столбце внутри 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.

EDIT: Однако, зная, какой из них использовать, в какой ситуации становится проблемой. Есть ли здесь лучшая практика или действительно ли это связано с пониманием того, что требуется команде или функции? До сих пор я просто ездил на велосипеде по ним, если моя функция не работает сначала (проб и ошибок).

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Оба '[[и' $выберите один элемент списка. Главный разница в том, что '$ не позволяет вычисленных индексов, тогда как '[[делает. 'X $name эквивалентно' x [[ "name", exact = FALSE]]. Кроме того, частичное сопоставление поведения [[может быть управляемый с использованием "точного аргумента".

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

Ответ 4

В этом случае, для большинства применений, я бы вообще избегал подстановки и пытался запомнить, что $, [ и [[ делать с фреймом данных. Я бы просто использовал 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

В большинстве случаев это намного яснее любого из методов подстановки (IMHO).

Ответ 5

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

> 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

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

Ответ 6

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

Ответ 7

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 

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

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

EDIT:

Неправильный исходный вопрос. 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

Не знаю, почему происходит различие.