programing

목록 또는 데이터 프레임 요소에 액세스하기 위한 대괄호 [ ]와 이중 대괄호 [[ ]의 차이점

golfzon 2023. 4. 9. 22:39
반응형

목록 또는 데이터 프레임 요소에 액세스하기 위한 대괄호 [ ]와 이중 대괄호 [[ ]의 차이점

R r data . frame r 、 R 、 data . frame 。[] ★★★★★★★★★★★★★★★★★」[[]].

이 둘의 차이점은 무엇이며, 어떤 경우에 다른 하나를 사용해야 합니까?

R Language Definition(R 언어 정의)은 다음 유형의 질문에 답변하는 데 유용합니다.

R에는 3개의 기본 인덱싱 연산자가 있으며 구문은 다음 예에 따라 표시됩니다.


    x[i]
    x[i, j]
    x[[i]]
    x[[i, j]]
    x$a
    x$"a"

및, 터터및 for for for for for 。[[은 되지 않습니다, .[형식(예를 들어 이름 또는 dimnames 속성을 삭제하고 문자 색인에 부분 일치가 사용됩니다.)인덱스를 때, 다차원 구조를 인덱싱합니다.x[[i]] ★★★★★★★★★★★★★★★★★」x[i] will will will 。ix

목록에는 일반적으로 다음과 같이 사용합니다.[[단일 , '선택'은 '선택'입니다.[선택한 요소의 목록을 반환합니다.

[[은 정수 인덱스를 할 수 , 형식에서는 단일 요소만 선택할 수 있습니다.[벡터에 의한 인덱싱을 허용합니다.될 수 각컴포넌트, 등에 결과는 여전히 단일 요소입니다.

두 메서드의 중요한 차이점은 추출에 사용할 때 반환되는 객체의 클래스 및 할당 중에 값의 범위를 허용할지 또는 단일 값만 허용할지 여부입니다.

다음 목록에서 데이터를 추출하는 경우를 고려하십시오.

foo <- list( str='R', vec=c(1,2,3), bool=TRUE )

, 하여 bool의 내부에 합니다.if()이렇게 차이를 알 수.[] ★★★★★★★★★★★★★★★★★」[[]]데이터 추출에 사용되는 경우.[]의 클래스 리스트가 data을 반환하고 method의 는 data.frame을 한다.[[]]method는 값의 유형에 따라 클래스가 결정되는 개체를 반환합니다.

이렇게 '우리'를 해서 '우리'를 사용해서[]

if( foo[ 'bool' ] ){ print("Hi!") }
Error in if (foo["bool"]) { : argument is not interpretable as logical

class( foo[ 'bool' ] )
[1] "list"

는 '아', '아', '아', '아', '아까',[]이 "Direct"에 직접 될 수 있는 .if()'어리다'사용해야 요.[[]]왜냐하면 'bool'에 저장되어 있는 'subl' 오브젝트가 반환되기 때문에 해당 클래스는 다음과 같습니다.

if( foo[[ 'bool' ]] ){ print("Hi!") }
[1] "Hi!"

class( foo[[ 'bool' ]] )
[1] "logical"

번째 은 ''는 '우리'와 '우리'와[]연산자를 사용하여 목록 또는 데이터 프레임의 컬럼에 있는 슬롯의 범위에 액세스 할 수 있습니다.[[]]연산자는 단일 슬롯 또는 열에 액세스할 수 있습니다.두 번째 목록을 사용하여 가치를 할당하는 경우를 고려해 보십시오.bar():

bar <- list( mat=matrix(0,nrow=2,ncol=2), rand=rnorm(1) )

foo의 마지막 두 슬롯을 bar에 포함된 데이터로 덮어쓰려고 합니다.를 사용하려고 , 「 」를 하려고 하면,[[]]오퍼레이터는 다음과 같이 동작합니다.

foo[[ 2:3 ]] <- bar
Error in foo[[2:3]] <- bar : 
more elements supplied than there are to replace

그 이유는[[]]는 단일 요소에 대한 접근으로 제한됩니다. 써야 요.[]:

foo[ 2:3 ] <- bar
print( foo )

$str
[1] "R"

$vec
     [,1] [,2]
[1,]    0    0
[2,]    0    0

$bool
[1] -0.6291121

할당이 성공하는 동안 foo의 슬롯은 원래 이름을 유지합니다.

이중 괄호는 목록 요소에 액세스하고 단일 괄호는 단일 요소를 포함하는 목록을 제공합니다.

lst <- list('one','two','three')

a <- lst[1]
class(a)
## returns "list"

a <- lst[[1]]
class(a)
## returns "character"

Hadley Wickham에서:

From 해들리 위컴

tidyverse / purrr을 사용하여 보여주기 위한 (크레이피 룩) 수정:

여기에 이미지 설명 입력

[]합니다.[[]] 내의 합니다.

alist <- list(c("a", "b", "c"), c(1,2,3,4), c(8e6, 5.2e9, -9.3e7))

str(alist[[1]])
 chr [1:3] "a" "b" "c"

str(alist[1])
List of 1
 $ : chr [1:3] "a" "b" "c"

str(alist[[1]][1])
 chr "a"

에 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★[[에는 재귀 인덱싱 기능도 탑재되어 있습니다.

이는 @JijoMatthew의 답변에서 암시되었지만 탐구하지 않았다.

에서 와 같이?"[[" , , , , , , , 입니다.x[[y]]서, snowledge.length(y) > 1는 다음과같이

x[[ y[1] ]][[ y[2] ]][[ y[3] ]] ... [[ y[length(y)] ]]

이것은, 다음의 차이에 관한 주된 요점이 되는 것은 바뀌지 않습니다.[ ★★★★★★★★★★★★★★★★★」[[--즉, 전자는 서브셋에 사용되고 후자는 단일 리스트 요소의 추출에 사용됩니다.

예를들면,

x <- list(list(list(1), 2), list(list(list(3), 4), 5), 6)
x
# [[1]]
# [[1]][[1]]
# [[1]][[1]][[1]]
# [1] 1
#
# [[1]][[2]]
# [1] 2
#
# [[2]]
# [[2]][[1]]
# [[2]][[1]][[1]]
# [[2]][[1]][[1]][[1]]
# [1] 3
#
# [[2]][[1]][[2]]
# [1] 4
#
# [[2]][[2]]
# [1] 5
#
# [[3]]
# [1] 6

값 3을 얻으려면 다음 작업을 수행합니다.

x[[c(2, 1, 1, 1)]]
# [1] 3

의 @JijoMatthew를 떠올려보세요.r:

r <- list(1:10, foo=1, far=2)

이 가 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아[[아,아,아,아,아,아,아,아,아,아.

r[[1:3]]

러의 r[[1:3]]에 실패했습니다. "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "

는 실제로 했기 때문에r[[1]][[2]][[3]] 의 " " " " 입니다.r가 1에서 했습니다. 재귀 인덱싱을 통해 추출하려는 시도가 실패했습니다.[[2]] 2.에서 2로 하다.

러의 r[[c("foo", "far")]] bound : " " " " " " " " " "

은 기, R은 여를 .r[["foo"]][["far"]]존재하지 않기 때문에 서브스크립트 오류가 발생합니다.

이 두 오류 모두 같은 메시지를 보내는 것이 더 도움이 될 수 있습니다.

말하면, 「 」[[연산자는 목록에서 요소를 추출합니다.[연산자는 목록의 서브셋을 가져옵니다.

하는 데 이 될 수 .[[ ... ]]축소 함수로서 표기법을 사용합니다.즉, 이름 있는 벡터, 리스트 또는 데이터 프레임에서 데이터를 취득하고 싶을 때입니다.계산에 이러한 개체의 데이터를 사용하려면 이 작업을 수행하는 것이 좋습니다.이 간단한 예들은 설명할 것이다.

(x <- c(x=1, y=2)); x[1]; x[[1]]
(x <- list(x=1, y=2, z=3)); x[1]; x[[1]]
(x <- data.frame(x=1, y=2, z=3)); x[1]; x[[1]]

세 번째 예에서는 다음과 같습니다.

> 2 * x[1]
  x
1 2
> 2 * x[[1]]
[1] 2

둘 다 부분집합 방식입니다.단일 괄호는 목록의 하위 집합을 반환합니다. 목록 자체는 목록이 됩니다. 즉, 여러 요소를 포함할 수도 있고 포함하지 않을 수도 있습니다.반면 이중 괄호는 목록에서 하나의 요소만 반환합니다.

·단일 괄호만 있으면 리스트가 표시됩니다.목록에서 여러 요소를 반환하려면 단일 괄호를 사용할 수도 있습니다.다음 목록을 고려하십시오.

>r<-list(c(1:10),foo=1,far=2);

이제 제가 목록을 표시하려고 할 때 목록이 어떻게 반환되는지 주의해 주세요.r을 입력하고 Enter 키를 누릅니다.

>r

#the result is:-

[[1]]

 [1]  1  2  3  4  5  6  7  8  9 10

$foo

[1] 1

$far

[1] 2

이제 싱글 브라켓의 마법을 살펴보겠습니다.

>r[c(1,2,3)]

#the above command will return a list with all three elements of the actual list r as below

[[1]]

 [1]  1  2  3  4  5  6  7  8  9 10

$foo

[1] 1


$far

[1] 2

화면에 r 값을 표시하려고 했을 때와 똑같습니다.즉, 싱글브래킷의 사용으로 리스트가 반환되었습니다.인덱스 1에는 10개의 요소의 벡터가 있고 foo와 far라는 이름의 요소가 2개 더 있습니다.단일 인덱스 또는 요소 이름을 단일 브래킷에 입력하도록 선택할 수도 있습니다. 예:

> r[1]

[[1]]

 [1]  1  2  3  4  5  6  7  8  9 10

이 예에서는 하나의 인덱스 "1"을 지정하고, 그 대신 하나의 요소(10개의 숫자로 이루어진 배열)를 가진 목록을 받았습니다.

> r[2]

$foo

[1] 1

위의 예에서는 인덱스 "2"를 1개 지정하고 그 대신 요소가1개 있는 리스트를 취득했습니다.

> r["foo"];

$foo

[1] 1

이 예에서는 1개의 요소의 이름을 전달하고 그 대신 하나의 요소와 함께 목록이 반환되었습니다.

다음과 같은 요소 이름의 벡터를 전달할 수도 있습니다.

> x<-c("foo","far")

> r[x];

$foo

[1] 1

$far
[1] 2

이 예에서는 foo와 far라는 두 가지 요소 이름을 가진 벡터를 전달했습니다.

대신 두 가지 요소가 포함된 목록을 받았습니다.

즉, 단일 브래킷은 항상 단일 브래킷에 전달한 요소 수 또는 인덱스 수와 동일한 요소의 수를 가진 다른 목록을 반환합니다.

반대로 이중 괄호는 항상 하나의 요소만 반환합니다.이중 괄호로 이동하기 전에 유의해야 할 사항입니다.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.

몇 가지 예를 들어 보겠습니다.굵은 글씨로 된 단어를 메모하고 다음 예제를 마치면 다시 읽어주세요.

이중 괄호는 인덱스의 실제 값을 반환합니다.(리스트는 반환되지 않습니다)

  > r[[1]]

     [1]  1  2  3  4  5  6  7  8  9 10


  >r[["foo"]]

    [1] 1

이중 괄호의 경우 벡터를 전달하여 여러 요소를 표시하려고 하면 해당 요구를 충족시키기 위해 작성된 것이 아니라 단일 요소를 반환하기 위해 작성된 것이기 때문에 오류가 발생합니다.

다음 사항을 고려하십시오.

> r[[c(1:3)]]
Error in r[[c(1:3)]] : recursive indexing failed at level 2
> r[[c(1,2,3)]]
Error in r[[c(1, 2, 3)]] : recursive indexing failed at level 2
> r[[c("foo","far")]]
Error in r[[c("foo", "far")]] : subscript out of bounds

다른 른른른른른 the the the the the the the the the the the the the the the the the the the the the the the created created created created created created created created 에서 작성한 데이터 합니다.split() if 모르면 모르면면split()는 키 필드에 따라 목록/데이터 프레임을 서브셋으로 그룹화합니다.여러 그룹으로 작업하고 싶을 때 플롯 등을 작성할 때 유용합니다.

> class(data)
[1] "data.frame"

> dsplit<-split(data, data$id)
> class(dsplit)
[1] "list"

> class(dsplit['ID-1'])
[1] "list"

> class(dsplit[['ID-1']])
[1] "data.frame"

아래의 자세한 설명을 참조해 주십시오.

나는 mtcars라고 불리는 R에 내장된 데이터 프레임을 사용해 왔다.

> mtcars 
               mpg cyl disp  hp drat   wt ... 
Mazda RX4     21.0   6  160 110 3.90 2.62 ... 
Mazda RX4 Wag 21.0   6  160 110 3.90 2.88 ... 
Datsun 710    22.8   4  108  93 3.85 2.32 ... 
           ............

테이블의 맨 위 줄을 열 이름을 포함하는 헤더라고 합니다.이후 각 가로줄은 데이터 행을 나타냅니다. 데이터 행은 행의 이름으로 시작하여 실제 데이터가 이어집니다.행의 각 데이터 멤버를 셀이라고 합니다.

단일 대괄호 "[]" 연산자

셀에서 데이터를 검색하려면 행과 열의 좌표를 단일 대괄호 "]" 연산자에 입력합니다.두 좌표는 쉼표로 구분됩니다.즉, 좌표는 행 위치에서 시작하여 쉼표로 이어지고 열 위치로 끝납니다.순서가 중요해요.

예 1:- mtcar의 첫 번째 행, 두 번째 열의 셀 값은 다음과 같습니다.

> mtcars[1, 2] 
[1] 6

예 2:- 또한 숫자 좌표 대신 행 및 열 이름을 사용할 수 있습니다.

> mtcars["Mazda RX4", "cyl"] 
[1] 6 

이중 대괄호 "[]]" 연산자

이중 대괄호 "[]]" 연산자가 있는 데이터 프레임 열을 참조합니다.

예 1:- 내장된 데이터 세트 mtcar의 아홉 번째 열 벡터를 검색하려면 mtcars[9]로 씁니다.

mtcars 99 ][ 1 ] 1 1 1 0 0 0 0 0 0 0 0 ...

예 2:- 동일한 열 벡터를 이름으로 검색할 수 있습니다.

mtcars " " am " ]] [ 1 1 1 1 0 0 0 0 0 0 0 ...

언급URL : https://stackoverflow.com/questions/1169456/the-difference-between-bracket-and-double-bracket-for-accessing-the-el

반응형