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
'code' 카테고리의 다른 글
| 비탈출 매개변수를 폐쇄적으로 사용하면 탈출할 수 있습니다. (0) | 2023.06.17 |
|---|---|
| $.textstatus는 성공을 표시하지만 데이터베이스는 업데이트되지 않습니까?제이쿼리 php 아약스 (0) | 2023.06.17 |
| Oracle 사용자 계정 상태를 EXPIRE(GRACE)에서 OPEN으로 변경 (0) | 2023.06.17 |
| 목표-C 분할()? (0) | 2023.06.17 |
| x86의 MOV가 정말 "무료"가 될 수 있습니까?왜 나는 이것을 전혀 재현할 수 없습니까? (0) | 2023.06.17 |