벡터의 값을 기반으로 데이터 프레임에서 행 선택
다음과 유사한 데이터가 있습니다.
dt <- structure(list(fct = structure(c(1L, 2L, 3L, 4L, 3L, 4L, 1L, 2L, 3L, 1L, 2L, 3L, 2L, 3L, 4L), .Label = c("a", "b", "c", "d"), class = "factor"), X = c(2L, 4L, 3L, 2L, 5L, 4L, 7L, 2L, 9L, 1L, 4L, 2L, 5L, 4L, 2L)), .Names = c("fct", "X"), class = "data.frame", row.names = c(NA, -15L))
fct
변수 의 값을 기반으로이 데이터 프레임에서 행을 선택하고 싶습니다 . 예를 들어 "a"또는 "c"를 포함하는 행을 선택하려면 다음과 같이 할 수 있습니다.
dt[dt$fct == 'a' | dt$fct == 'c', ]
어느 양보
1 a 2
3 c 3
5 c 5
7 a 7
9 c 9
10 a 1
12 c 2
14 c 4
예상대로. 하지만 내 실제 데이터는 더 복잡하고 실제로 다음과 같은 벡터의 값을 기반으로 행을 선택하고 싶습니다.
vc <- c('a', 'c')
그래서 나는 시도했다
dt[dt$fct == vc, ]
하지만 물론 작동하지 않습니다. 벡터를 반복하고 필요한 행을 가져 와서 새 데이터 프레임에 추가하는 코드를 작성할 수 있다는 것을 알고 있지만 더 우아한 방법이 있기를 바랐습니다.
그렇다면 벡터의 내용을 기반으로 데이터를 필터링 / 부분 설정하려면 vc
어떻게해야합니까?
를보세요 ?"%in%"
.
dt[dt$fct %in% vc,]
fct X
1 a 2
3 c 3
5 c 5
7 a 7
9 c 9
10 a 1
12 c 2
14 c 4
다음을 사용할 수도 있습니다 ?is.element
.
dt[is.element(dt$fct, vc),]
위와 유사하게 filter
from dplyr
:
filter(df, fct %in% vc)
또 다른 옵션은 keyed를 사용하는 것입니다 data.table
.
library(data.table)
setDT(dt, key = 'fct')[J(vc)] # or: setDT(dt, key = 'fct')[.(vc)]
결과 :
fct X
1: a 2
2: a 7
3: a 1
4: c 3
5: c 5
6: c 9
7: c 2
8: c 4
이것이하는 일 :
setDT(dt, key = 'fct')
변환data.frame
(A)에data.table
(a 향상된 형태 인data.frame
)와fct
키로서 열 집합.- 다음
vc
으로[J(vc)]
.
참고 : 키가 인자 / 문자 변수 인 경우 사용할 수도 setDT(dt, key = 'fct')[vc]
있지만 vc
숫자 형 벡터 일 때는 작동하지 않습니다 . 때 vc
숫자 벡터이고에 싸여되지 J()
나 .()
, vc
rowIndex에로 작동합니다.
의 개념에 대한 자세한 설명은 키 및 서브 세트는 네트에서 찾을 수 있습니다 키와 빠른 이진 검색 기반의 부분 집합 .
An alternative as suggested by @Frank in the comments:
setDT(dt)[J(vc), on=.(fct)]
When vc
contains values that are not present in dt
, you'll need to add nomatch = 0
:
setDT(dt, key = 'fct')[J(vc), nomatch = 0]
or:
setDT(dt)[J(vc), on=.(fct), nomatch = 0]
'IT TIP' 카테고리의 다른 글
WAS (Windows Process Activation Service)에서 응용 프로그램 풀을 제공하기 위해 작업자 프로세스를 시작할 때 오류가 발생했습니다. (0) | 2020.12.14 |
---|---|
함수에 매개 변수로 전달하지 않고 Spring에서 현재 사용자 로케일을 얻는 방법은 무엇입니까? (0) | 2020.12.14 |
거대한 벡터 목록을 행렬로 더 효율적으로 변환하는 방법은 무엇입니까? (0) | 2020.12.14 |
Xcode 예외 중단 점이 throw되는 예외의 세부 정보를 인쇄하지 않습니다. (0) | 2020.12.14 |
Ruby 버전은 2.0.0이지만 Gemfile은 2.1.0을 지정했습니다. (0) | 2020.12.14 |