IT TIP

벡터의 값을 기반으로 데이터 프레임에서 행 선택

itqueen 2020. 12. 14. 21:25
반응형

벡터의 값을 기반으로 데이터 프레임에서 행 선택


다음과 유사한 데이터가 있습니다.

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),]

위와 유사하게 filterfrom 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().(), vcrowIndex에로 작동합니다.

의 개념에 대한 자세한 설명은 및 서브 세트는 네트에서 찾을 수 있습니다 키와 빠른 이진 검색 기반의 부분 집합 .

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]

참고URL : https://stackoverflow.com/questions/11612235/select-rows-from-a-data-frame-based-on-values-in-a-vector

반응형