문제

나는 a에서 행을 필터링하고 싶다 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 섬유 아세포"또는 "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"이라고하지만 결과를 볼 수 있듯이 잘못된 형식으로 제공합니다.

도움이 되었습니까?

해결책

그에 따라 행을 선택합니다 하나 'cell_type'(예 : 'hesc'), 사용 ==:

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

두 개 이상의 다른 'cell_type'에 따라 행을 선택하려면 (예 : 'hesc' 또는 'bj fibroblast'), 사용 %in%:

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

다른 팁

사용 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"))

이유 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

당신은 사용할 수 있습니다 dplyr 패키지:

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

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

이 경우 간단히 참조 할 수 있습니다 열 이름 다음과 같이 필터링하려고합니다.

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

나는 DataFrame을 작업하고 있으며 제공된 답변에 운이 없었기 때문에 항상 0 행을 반환 했으므로 GREPL을 찾아 사용했습니다.

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

기본적으로 내 데이터 프레임을 전송 방향 열에 "다운 링크"를 포함하는 행으로 만 트리밍했습니다. 추신 : 왜 내가 예상되는 행동을 보지 못하는지 추측 할 수 있다면 의견을 남겨주세요.

특히 원래 질문에 :

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

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

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

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

이것은 또한 NAS를 처리하고 결과 데이터 프레임에서 떨어 뜨립니다.

9840 x 24 Dataframe에서 50000 배에서이를 실행하면% 메소드의%보다 60% 빠른 런타임이있는 것처럼 보입니다.

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"]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top