R fornece dois métodos diferentes para acessar os elementos de uma lista ou data.frame: []
e [[]]
.
Qual é a diferença entre os dois e em que situações devo usar um sobre o outro?
OR Language Definition é útil para responder a esses tipos de perguntas:
R possui três operadores de indexação básicos, com sintaxe exibida pelos seguintes exemplos
x[i] x[i, j] x[[i]] x[[i, j]] x$a x$"a"
Para vetores e matrizes, os
[[
formulários raramente são usados, embora apresentem pequenas diferenças semânticas do[
formulário (por exemplo, elimina qualquer atributo de nomes ou nomes de nomes e essa correspondência parcial é usada para índices de caracteres). Ao indexar estruturas multidimensionais com um único índice,x[[i]]
oux[i]
retornará oi
th elemento sequencial dex
.Para listas, geralmente se usa
[[
para selecionar qualquer elemento único, enquanto[
retorna uma lista dos elementos selecionados.O
[[
formulário permite que apenas um único elemento seja selecionado usando índices inteiros ou de caracteres, enquanto[
permite a indexação por vetores. Observe que, para uma lista, o índice pode ser um vetor e cada elemento do vetor é aplicado, por sua vez, à lista, ao componente selecionado, ao componente selecionado desse componente e assim por diante. O resultado ainda é um único elemento.
[
sempre retornar um meio de lista que você começa a mesma classe de saída parax[v]
, independentemente da duração dav
. Por exemplo, pode-se quererlapply
mais de um subconjunto de uma lista:lapply(x[v], fun)
. Se você[
soltasse a lista de vetores de comprimento um, isso retornaria um erro sempre quev
tivesse comprimento um.As diferenças significativas entre os dois métodos são a classe dos objetos que eles retornam quando usados para extração e se eles podem aceitar um intervalo de valores ou apenas um valor único durante a atribuição.
Considere o caso da extração de dados na seguinte lista:
Digamos que gostaríamos de extrair o valor armazenado por bool de foo e usá-lo dentro de uma
if()
declaração. Isso ilustrará as diferenças entre os valores de retorno[]
e[[]]
quando eles são usados para extração de dados. O[]
método retorna objetos da lista de classes (ou data.frame se foo era um data.frame) enquanto o[[]]
método retorna objetos cuja classe é determinada pelo tipo de seus valores.Portanto, o uso do
[]
método resulta no seguinte:Isso ocorre porque o
[]
método retornou uma lista e uma lista não é um objeto válido para passar diretamente para umaif()
instrução. Nesse caso, precisamos usar[[]]
porque ele retornará o objeto "vazio" armazenado em 'bool', que terá a classe apropriada:A segunda diferença é que o
[]
operador pode ser usado para acessar um intervalo de slots em uma lista ou colunas em um quadro de dados, enquanto o[[]]
operador está limitado a acessar um único slot ou coluna. Considere o caso da atribuição de valor usando uma segunda listabar()
:Digamos que queremos substituir os dois últimos slots de foo pelos dados contidos em bar. Se tentarmos usar o
[[]]
operador, é isso que acontece:Isso ocorre porque o
[[]]
acesso a um único elemento é limitado. Precisamos usar[]
:Observe que, embora a tarefa tenha sido bem-sucedida, os slots foo mantiveram seus nomes originais.
fonte
Os colchetes duplos acessam um elemento da lista , enquanto um colchete fornece uma lista com um único elemento.
fonte
Partida Hadley Wickham:
Minha modificação (de baixa qualidade) para mostrar usando tidyverse / purrr:
fonte
[]
extrai uma lista,[[]]
extrai elementos dentro da listafonte
Apenas adicionando aqui que
[[
também está equipado para indexação recursiva .Isso foi sugerido na resposta por @JijoMatthew, mas não explorado.
Conforme observado em
?"[["
, sintaxe comox[[y]]
, ondelength(y) > 1
, é interpretada como:Observe que isso não altera qual deve ser sua principal explicação sobre a diferença entre
[
e[[
- ou seja, que o primeiro é usado para subconjunto e o último é usado para extrair elementos de lista única.Por exemplo,
Para obter o valor 3, podemos fazer:
Voltando à resposta de @ JijoMatthew acima, lembre-se
r
:Em particular, isso explica os erros que tendemos a obter ao usar incorretamente
[[
, a saber:Como esse código realmente tentou avaliar
r[[1]][[2]][[3]]
e o aninhamento der
paradas no nível um, a tentativa de extrair por meio da indexação recursiva falhou[[2]]
no nível 2.Aqui, R estava procurando
r[["foo"]][["far"]]
, o que não existe, então obtemos o erro de subscrito fora dos limites.Provavelmente seria um pouco mais útil / consistente se esses dois erros dessem a mesma mensagem.
fonte
Ambos são formas de subconjunto. O colchete único retornará um subconjunto da lista, que por si só será uma lista. ou seja: pode ou não conter mais de um elemento. Por outro lado, um colchete retornará apenas um elemento da lista.
-Suporte único nos dará uma lista. Também podemos usar colchetes se quisermos retornar vários elementos da lista. considere a seguinte lista: -
Agora observe a maneira como a lista é retornada quando tento exibi-la. Digite digito e pressione enter
Agora veremos a magia do suporte simples: -
que é exatamente o mesmo que quando tentamos exibir o valor de r na tela, o que significa que o uso de colchetes retornou uma lista, onde no índice 1 temos um vetor de 10 elementos, temos mais dois elementos com nomes foo e longe. Também podemos optar por fornecer um único índice ou nome de elemento como entrada para o colchete único. por exemplo:
Neste exemplo, fornecemos um índice "1" e, em troca, obtivemos uma lista com um elemento (que é uma matriz de 10 números)
No exemplo acima, demos um índice "2" e, em troca, obtivemos uma lista com um elemento
Neste exemplo, passamos o nome de um elemento e, em troca, uma lista foi retornada com um elemento.
Você também pode passar um vetor de nomes de elementos como: -
Neste exemplo, passamos um vetor com dois nomes de elementos "foo" e "far"
Em troca, temos uma lista com dois elementos.
Em suma, o colchete único sempre retornará outra lista com número de elementos igual ao número de elementos ou número de índices que você passa para o colchete único.
Por outro lado, um colchete duplo sempre retornará apenas um elemento. Antes de passar para o colchete duplo, observe uma nota.
NOTE:THE MAJOR DIFFERENCE BETWEEN THE TWO IS THAT SINGLE BRACKET RETURNS YOU A LIST WITH AS MANY ELEMENTS AS YOU WISH WHILE A DOUBLE BRACKET WILL NEVER RETURN A LIST. RATHER A DOUBLE BRACKET WILL RETURN ONLY A SINGLE ELEMENT FROM THE LIST.
Vou colocar alguns exemplos. Mantenha uma anotação das palavras em negrito e retorne a ela depois de concluir os exemplos abaixo:
O colchete duplo retornará o valor real no índice. ( NÃO retornará uma lista)
para colchetes duplos, se tentarmos exibir mais de um elemento passando um vetor, resultará em um erro apenas porque não foi criado para atender a essa necessidade, mas apenas para retornar um único elemento.
Considere o seguinte
fonte
[]
retornar uma classe de lista, mesmo que seja um dígito único, é muito pouco intuitivo. Eles deveriam ter criado outra sintaxe, como([])
para a lista, e[[]]
acessar o elemento real está correto. Prefiro pensar[[]]
no valor bruto como em outros idiomas.Para ajudar os novatos a navegar pelo nevoeiro manual, pode ser útil ver a
[[ ... ]]
notação como uma função em colapso - em outras palavras, é quando você deseja apenas 'obter os dados' de um vetor, lista ou quadro de dados nomeado. É bom fazer isso se você quiser usar dados desses objetos para cálculos. Esses exemplos simples ilustrarão.Então, a partir do terceiro exemplo:
fonte
iris[[1]]
retorna um vetor, enquantoiris[1]
retorna um data.frameSendo terminológico, o
[[
operador extrai o elemento de uma lista, enquanto o[
operador pega um subconjunto de uma lista.fonte
Para outro caso de uso concreto, use colchetes duplos quando desejar selecionar um quadro de dados criado pela
split()
função. Se você não souber,split()
agrupa um quadro de lista / dados em subconjuntos com base em um campo-chave. É útil se, quando você quiser operar em vários grupos, plotá-los, etc.fonte
Por favor, consulte a explicação detalhada abaixo.
Eu usei o quadro de dados interno no R, chamado mtcars.
A linha superior da tabela é chamada de cabeçalho que contém os nomes das colunas. Cada linha horizontal posteriormente indica uma linha de dados, que começa com o nome da linha e depois é seguida pelos dados reais. Cada membro de dados de uma linha é chamado de célula.
operador de colchete único "[]"
Para recuperar dados em uma célula, inseriríamos suas coordenadas de linha e coluna no único operador de colchete "[]". As duas coordenadas são separadas por vírgula. Em outras palavras, as coordenadas começam com a posição da linha, seguidas por vírgula e terminam com a posição da coluna. A ordem é importante.
Por exemplo 1: - Aqui está o valor da célula da primeira linha, segunda coluna dos mtcars.
Exemplo 2: - Além disso, podemos usar os nomes de linhas e colunas em vez das coordenadas numéricas.
Operador de colchete duplo "[[]]"
Fazemos referência a uma coluna de quadro de dados com o operador de colchete duplo "[[]]".
Exemplo 1: - Para recuperar o vetor da nona coluna do conjunto de dados interno mtcars, escrevemos mtcars [[9]].
Ex. 2: - Podemos recuperar o mesmo vetor de coluna por seu nome.
fonte
Além do que, além do mais:
Seguindo o LINK da RESPOSTA aqui.
Aqui está um pequeno exemplo abordando o seguinte ponto:
x[i, j] vs x[[i, j]]
fonte