논리적 조건을 기준으로 data.frame 행 필터링
에서 행을 필터링합니다.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"이라고 부르지만, 결과를 잘못된 형식으로 제공하는 경우에 사용할 수 있습니다.
하나의 '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")
아무도 어떤 기능을 포함하지 않은 것 같습니다.필터링에도 유용할 수 있습니다.
expr[which(expr$cell == 'hesc'),]
이는 또한 NA를 처리하고 결과 데이터 프레임에서 삭제합니다.
9840x24 데이터 프레임에서 이를 50000회 실행하면, 어떤 방법이 %in% 방법보다 실행 시간이 60% 더 빠른 것처럼 보입니다.
저는 데이터 프레임에서 작업하고 있었지만 제공된 답변과 일치하지 않아 항상 0개의 행이 반환되었기 때문에 grepl을 찾아서 사용했습니다.
df = df[grepl("downlink",df$Transmit.direction),]
기본적으로 전송 방향 열에 "다운링크"가 포함된 행만 데이터 프레임을 잘라냈습니다.추신. 제가 예상되는 행동을 보지 못하는 이유를 짐작할 수 있는 사람이 있다면 댓글을 남겨주세요.
원래 질문에 대한 구체적인 내용:
expr[grepl("hesc",expr$cell_type),]
expr[grepl("bj fibroblast|hesc",expr$cell_type),]
때때로 필터링할 열이 열 인덱스 2와 다른 위치에 나타나거나 변수 이름을 가질 수 있습니다.
이 경우 필터링할 열 이름을 다음과 같이 간단히 참조할 수 있습니다.
columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]
이것은 저에게 마법처럼 작용했습니다.
celltype_hesc_bool = expr['cell_type'] == 'hesc'
expr_celltype_hesc = expr[celltype_hesc]
우리는 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"]
언급URL : https://stackoverflow.com/questions/1686569/filter-data-frame-rows-by-a-logical-condition
'programing' 카테고리의 다른 글
Larvel 5.4 애플리케이션 내에서 Vuex 상태를 초기화하려면 어떻게 해야 합니까? (0) | 2023.06.08 |
---|---|
":key => "value"와 "key:value" 해시 표기법 사이에 차이점이 있습니까? (0) | 2023.06.08 |
"+" (+ 기호) CSS 선택기는 무엇을 의미합니까? (0) | 2023.06.03 |
루비에서 파일에 쓰는 방법은? (0) | 2023.06.03 |
조각에서 ID별 보기 찾기 (0) | 2023.06.03 |