dplyr tbl 열을 벡터로 추출


175

데이터베이스 백엔드가있는 tbl에서 dplyr tbl의 한 열을 벡터로 얻는 더 간결한 방법이 있습니까?

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.

그러나 약간 서투른 것 같습니다.


이다 collect(iris2)$Species적은 서투른은?
CJ Yetman

답변:


178

dplyr 0.7.0을 사용 pull하면에서 벡터를 얻는 데 사용할 수 있습니다 tbl.


library("dplyr")
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
db <- src_sqlite(tempfile(), create = TRUE)
iris2 <- copy_to(db, iris)
vec <- pull(iris2, Species)
head(vec)
#> [1] "setosa" "setosa" "setosa" "setosa" "setosa" "setosa"

96

@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"]]

2
풀 기능이 마음에 듭니다. : 하나의 변수가 어디 난 그냥 경우에 하나의 단순화를 추가 할 것입니다 pull <- function(x, y) { if (ncol(x) == 1) y <- 1 else y x[ , if (is.name(substitute(y))) deparse(substitute(y)) else y, drop = FALSE][[1]] }당신이 갈 수 있도록iris2 %>% pull()
Rappster

7
magrittr노출 연산자 ( %$%)를 사용하여 데이터 프레임에서 벡터를 가져올 수도 있습니다 . 즉 iris2 %>% select(Species) %>% collect() %$% Species.
seasmith

@ Luke1018이 코멘트에서 답변을 만들어야합니다
rrs


72

unlist열 이름을 반복하거나 색인을 지정할 필요가 없으므로 읽기 쉬운 것을 사용할 수도 있습니다 .

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

1
이것은 벡터 및 데이터 프레임과 동일하게 작동하므로 가장 다양한 방법으로 보입니다. 즉, 함수가 더 무의식적입니다.
geotheory

나는이 정확한 질문에 대한 답을 찾고 있었고 unlist정확히 내가 필요한 것입니다. 감사!
Andrew Brēza

unlist또한 여러 열에서 값을 추출하고 (모든 값을 단일 벡터로 결합) dplyr::pull단일 열로 제한됩니다.
filups21

21

extract2편의 기능을 magrittr다음 과 같이 사용합니다 .

library(magrittr)
library(dplyr)

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

collect()사이 에 사용 하시겠습니까? selectextract2
nacnudus

10
use_series(Species)아마도 더 읽기 쉽습니다. 이 기능들에 대해 알려 주셔서 감사합니다. 다른 유용한 기능들도 있습니다.
nacnudus

20

아마 쓸 것입니다 :

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

dplyr은 tbls의 데이터를 처리하도록 설계되었으므로 단일 데이터 열을 얻는 더 좋은 방법은 없습니다.


그보다 더 공정하다고 말할 수는 없습니다. unique (table $ column)을 사용하여 가짜 값을 확인하려고하면 콘솔에서 대화 형으로 발생했습니다.
nacnudus 2013

4
이 경우 @nacnudus 당신도 할 수 있습니다group_by(column) %.% tally()
hadley

12
인수가 drop = TRUE하는 dplyr::select우리가 실제로 벡터를 추출 할 필요가 꽤 많은 사용 사례에 대한 놀라운 것입니다.
Antoine Lizée

이것이 Sparklyr sdf에서 열을 가져올 수있는 유일한 방법이었습니다. 버전 0.7.8에서는 Pull이 작동하지 않았습니다.
Meep

16

@ Luke1018은 다음 중 한 가지 의견으로이 솔루션을 제안했습니다.

magrittr노출 연산자 ( %$%)를 사용하여 데이터 프레임에서 벡터를 가져올 수도 있습니다 .

예를 들면 다음과 같습니다.

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

나는 그것이 그 자신의 대답이 가치가 있다고 생각했다.


나는 이것을 찾고 있었다.
Diego-MX

colname 자체가 아니라 그것을 포함하는 문자열 변수를 전달하려면 어떻게해야합니까?
mzuba

@mzuba tibble(x = 1:10, y = letters[1:10]) %>% select_("x") %>% unlist()%>% unname()원하는 경우 끝에 다른 것을 추가 할 수도 있지만 내 목적으로 마지막 파이프 체인 링크가 필요하다는 것을 알지 못했습니다. 파이프 체인에 추가하는 것과 동일한 작업을 수행 use.names = FALSE하는 unlist()명령을 지정할 수도 있습니다 unname().
마크 화이트

1
@ mzuba pull지금 명령 을 사용합니다 . 내 솔루션은 dplyr버전 0.6 이전에 작성되었습니다 .
rrs

1
참고 것을 %$%반면은 어떤 목록 작동 pull()하지 않습니다
wint3rschlaefer

2

인덱싱에 대괄호를 사용하는 데 익숙한 경우 또 다른 옵션은 deframe () 호출에서 일반적인 인덱싱 방법을 래핑하는 것입니다 .

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

that과 pull () 은 모두 tibble column을 얻는 좋은 방법입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.