В 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: Однако, зная, какой из них использовать, в какой ситуации становится проблемой. Есть ли здесь лучшая практика или действительно ли это связано с пониманием того, что требуется команде или функции? До сих пор я просто ездил на велосипеде по ним, если моя функция не работает сначала (проб и ошибок).
Ответы
Ответ 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
Не знаю, почему происходит различие.