논리적 조건으로 data.frame 행 필터링


155

data.frame논리적 조건을 기반으로 행을 필터링하고 싶습니다 . 내가 같은 데이터 프레임을 가지고 있다고 가정 해 봅시다

   expr_value     cell_type
1    5.345618 bj fibroblast
2    5.195871 bj fibroblast
3    5.247274 bj fibroblast
4    5.929771          hesc
5    5.873096          hesc
6    5.665857          hesc
7    6.791656          hips
8    7.133673          hips
9    7.574058          hips
10   7.208041          hips
11   7.402100          hips
12   7.167792          hips
13   7.156971          hips
14   7.197543          hips
15   7.035404          hips
16   7.269474          hips
17   6.715059          hips
18   7.434339          hips
19   6.997586          hips
20   7.619770          hips
21   7.490749          hips

내가 원하는 것은 동일하게 보이지만 하나의 cell_type에 대한 데이터 만있는 새로운 데이터 프레임을 얻는 것입니다. 예를 들어 셀 유형 "hesc"가 포함 된 하위 집합 / 선택 행 :

   expr_value     cell_type
1    5.929771          hesc
2    5.873096          hesc
3    5.665857          hesc

또는 셀 유형 "bj fibroblast"또는 "hesc":

   expr_value     cell_type
1    5.345618 bj fibroblast
2    5.195871 bj fibroblast
3    5.247274 bj fibroblast
4    5.929771          hesc
5    5.873096          hesc
6    5.665857          hesc

이 작업을 수행하는 쉬운 방법이 있습니까?

난 노력 했어:

expr[expr[2] == 'hesc']
# [1] "5.929771" "5.873096" "5.665857" "hesc"     "hesc"     "hesc"    

원래 데이터 프레임을 "expr"이라고하지만 결과가 잘못된 것처럼 표시됩니다.

답변:


210

하나의 'cell_type'(예 : 'hesc') 에 따라 행을 선택하려면 ==다음을 사용하십시오 .

expr[expr$cell_type == "hesc", ]

둘 이상의 다른 'cell_type'(예 : 'hesc' 또는 'bj fibroblast') 에 따라 행을 선택하려면 %in%다음을 사용하십시오 .

expr[expr$cell_type %in% c("hesc", "bj fibroblast"), ]

28
==함수는 NA 레코드뿐만 아니라 "hesc"도 선택하지만 %in%그렇지는 않습니다.
Matt Parker

이것이 지금 작동하는지 궁금하십니까? 이런 식으로 조건에 따라 데이터 프레임을 하위 집합으로 만들 수 없었습니다.
Sumanth Lazarus

85

사용 subset(대화식 사용)

subset(expr, cell_type == "hesc")
subset(expr, cell_type %in% c("bj fibroblast", "hesc"))

또는 더 나은 dplyr::filter()

filter(expr, cell_type %in% c("bj fibroblast", "hesc"))

37
꼼꼼한! 의 문서는 subset프로그래밍이 [같은 표준 부분 집합 기능을 사용하는 것이 좋습니다이 편리한 기능을 대화 형으로 사용하기위한 것입니다 ", 특히 인수의 비 standar을 D 평가 :. 큰 경고가 일부는 예상치 못한 consequen의 CES를 가질 수 있습니다 "
Aleksandar Dimitrov

33

expr[expr[2] == 'hesc']작동하지 않는 이유 는 데이터 프레임의 경우 x[y]행이 아닌 열을 선택하기 때문입니다. 행을 선택하려면 x[y,]대신 구문으로 변경하십시오 .

> expr[expr[2] == 'hesc',]
  expr_value cell_type
4   5.929771      hesc
5   5.873096      hesc
6   5.665857      hesc

이것은 NA또한 모든 레코드를 가져옵니다 ! 따라서 적용 할 수 없습니다. 이것이 사실 인 것처럼 보이는 이유는 expr 데이터 프레임 NA에 필터링 된 열 이 없기 때문입니다 . 거기에 NA있다면, 내가 말한대로 당신의 방법은 적용되지 않습니다.
Erdogan CEVHER

26

dplyr패키지를 사용할 수 있습니다 :

library(dplyr)
filter(expr, cell_type == "hesc")
filter(expr, cell_type == "hesc" | cell_type == "bj fibroblast")

5

아무도 어떤 기능을 포함하지 않은 것 같습니다. 필터링에도 유용 할 수 있습니다.

expr[which(expr$cell == 'hesc'),]

또한 NA를 처리하고 결과 데이터 프레임에서 제거합니다.

이것을 9840 x 24 데이터 프레임에서 50000 번 실행하면 어떤 메소드가 % in % 메소드보다 60 % 빠른 실행 시간을 갖는 것처럼 보입니다.


4

나는 데이터 프레임에서 작업하고 제공된 답변으로 운이 없었으며 항상 0 행을 반환하므로 grepl을 찾아서 사용했습니다.

df = df[grepl("downlink",df$Transmit.direction),]

기본적으로 전송 방향 열에 "다운 링크"가 포함 된 행으로 내 데이터 프레임을 자릅니다. 추신 : 왜 내가 예상되는 행동을 보지 못하는지 추측 할 수 있다면 의견을 남겨주십시오.

원래 질문에 구체적으로 :

expr[grepl("hesc",expr$cell_type),]

expr[grepl("bj fibroblast|hesc",expr$cell_type),]

3

때로는 필터링하려는 열이 열 인덱스 2와 다른 위치에 나타나거나 변수 이름이있을 수 있습니다.

이 경우 필터링하려는 열 이름 을 간단히 참조 할 수 있습니다 .

columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]

이것은 NA또한 모든 레코드를 가져옵니다 ! 따라서 적용 할 수 없습니다.
Erdogan CEVHER

0

data.table 라이브러리를 사용할 수 있습니다

  library(data.table)
  expr <- data.table(expr)
  expr[cell_type == "hesc"]
  expr[cell_type %in% c("hesc","fibroblast")]

또는 %like%패턴 일치를 위해 연산자를 사용하여 필터링

 expr[cell_type %like% "hesc"|cell_type %like% "fibroblast"]

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