code

adplyrtbl 열을 벡터로 추출합니다.

starcafe 2023. 6. 17. 09:32
반응형

adplyrtbl 열을 벡터로 추출합니다.

데이터베이스 백엔드가 있는 tbl에서 adplyrtbl 열을 벡터로 가져오는 더 간단한 방법이 있습니까(즉, 데이터 프레임/테이블을 직접 하위 집합으로 만들 수 없음)?

require(dplyr)
db <- src_sqlite(tempfile(), create = TRUE)
iris2 <- copy_to(db, iris)
iris2$Species
# NULL

그건 너무 쉬웠을 거예요, 그래서.

collect(select(iris2, Species))[, 1]
# [1] "setosa"     "setosa"     "setosa"     "setosa"  etc.

그런데 좀 어설픈 것 같아요.

dplyr >= 0.7.0을 사용하면pull()에서 벡터를 얻다tbl.


library(dplyr, warn.conflicts = FALSE)
db <- src_sqlite(tempfile(), create = TRUE)
iris2 <- copy_to(db, iris)
vec <- pull(iris2, Species)
head(vec)
#> [1] "setosa" "setosa" "setosa" "setosa" "setosa" "setosa"

@nacnudus의 댓글에 따르면, 그것은 다음과 같이 보입니다.pull기능은 dplyr 0.6에서 구현되었습니다.

iris2 %>% pull(Species)

이전 버전의 dplyr의 경우 컬럼을 조금 더 쉽게 꺼낼 수 있는 깔끔한 기능이 있습니다(타자하기 쉽고 읽기 쉬움).

pull <- function(x,y) {x[,if(is.name(substitute(y))) deparse(substitute(y)) else y, drop = FALSE][[1]]}

이를 통해 다음 중 하나를 수행할 수 있습니다.

iris2 %>% pull('Species')
iris2 %>% pull(Species)
iris2 %>% pull(5)

결과적으로...

 [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4

또한 데이터 프레임에서도 잘 작동합니다.

> mtcars %>% pull(5)
 [1] 3.90 3.90 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 3.92 3.07 3.07 3.07 2.93 3.00 3.23 4.08 4.93 4.22 3.70 2.76 3.15 3.73 3.08 4.08 4.43
[28] 3.77 4.22 3.62 3.54 4.11

v0.2에서 이를 수행하는 좋은 방법dplyr:

iris2 %>% select(Species) %>% collect %>% .[[5]]

또는 원하는 경우:

iris2 %>% select(Species) %>% collect %>% .[["Species"]]

아니면 테이블이 너무 크지 않다면 그냥...

iris2 %>% collect %>% .[["Species"]]

사용할 수도 있습니다.unlist열 이름을 반복하거나 인덱스를 지정할 필요가 없기 때문에 읽기가 더 쉽습니다.

iris2 %>% select(Species) %>% unlist(use.names = FALSE)

나는 그것을 사용할 것입니다.extract2의 편의 기능magrittr:

library(magrittr)
library(dplyr)

iris2 %>%
  select(Species) %>%
  extract2(1)  

저는 아마 이렇게 쓸 것입니다.

collect(select(iris2, Species))[[1]]

dplyr은 대량의 데이터를 처리하도록 설계되었기 때문에 단일 데이터 열을 얻는 데 더 좋은 방법은 없습니다.

@Luke1018은 다음 의견 중 하나에서 이 솔루션을 제안했습니다.

사용할 수도 있습니다.magrittr박람회 운영자(%$%) 데이터 프레임에서 벡터를 끌어옵니다.

예:

iris2 %>% select(Species) %>% collect() %$% Species

나는 그것이 스스로 대답할 가치가 있다고 생각했습니다.

인덱싱에 대괄호를 사용하는 데 익숙하다면 프레임 호출()에서 일반적인 인덱싱 접근 방식을 래핑하는 것도 방법입니다. 예를 들어 다음과 같습니다.

library(tidyverse)

iris2 <- as_tibble(iris)

# using column name
deframe(iris2[, 'Sepal.Length'])

# [1] 5.1 4.9 4.7 4.6 5.0 5.4

# using column number
deframe(iris2[, 1])

# [1] 5.1 4.9 4.7 4.6 5.0 5.4

그것과 당기기()는 둘 다 경골 기둥을 얻는 아주 좋은 방법입니다.

열을 벡터로 추출하는 또 다른 빠른 방법은 c() 함수를 사용하여 데이터 프레임을 목록으로 변환한 다음 다음과 같습니다.

c(iris)$Species
c(iris)$Sepal.Length

적용자 접근법을 사용한 열 대 벡터:

iris %>% select(Sepal.Length) %>% 
         as.matrix() %>% 
         as.vector()

데이터 집합의 모든 값을 벡터로 사용하려면 다음을 수행합니다.

# I have this tibble:
iris %>% as_tibble() %>% head(3)
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
          <dbl>       <dbl>        <dbl>       <dbl> <fct>  
 1          5.1         3.5          1.4         0.2 setosa 
 2          4.9         3            1.4         0.2 setosa 
 3          4.7         3.2          1.3         0.2 setosa 

열 값 순서(5.1, 4.9, 4.7,...)에 대해 이 작업을 수행합니다.

iris %>% as_tibble() %>% as.matrix %>% as.vector()

  [1] "5.1"        "4.9"        "4.7"       
  [4] "4.6"        "5.0"        "5.4"       
  [7] "4.6"        "5.0"        "4.4"       
 [10] "4.9"        "5.4"        "4.8" 
 ....
[742] "virginica"  "virginica"  "virginica" 
[745] "virginica"  "virginica"  "virginica" 
[748] "virginica"  "virginica"  "virginica"

행 값 순서(5.1, 3.5, 1.4,...)에 대해 이 작업을 수행합니다.

iris %>% as_tibble() %>% as.matrix %>% t() %>% as.vector()

  [1] "5.1"        "3.5"        "1.4"       
  [4] "0.2"        "setosa"     "4.9"       
  [7] "3.0"        "1.4"        "0.2"       
 [10] "setosa"     "4.7"        "3.2"       
 [13] "1.3"        "0.2"        "setosa"
 ....
[739] "2.0"        "virginica"  "6.2"       
[742] "3.4"        "5.4"        "2.3"       
[745] "virginica"  "5.9"        "3.0"       
[748] "5.1"        "1.8"        "virginica"

언급URL : https://stackoverflow.com/questions/21618423/extract-a-dplyr-tbl-column-as-a-vector

반응형