접기 또는 특정 접기가있는 행 필터링

Nov 28 2020

저는 여전히 R을 배우고 있습니다.이 데이터 셋 이 있고 5 개의 열이 있고 첫 번째 열은 tracking_id이고 다음 4 개 열에는 4 개의 그룹 값이 있습니다.

마지막 세 열 ( "CD44hi_CD69low_rep", "CD44hi_CD69hi_CD103low_rep", "CD44hi_CD69hi_CD103hi_rep")을 비교 한 후 열 ( "CD44low_rep")에 비해 8 배 높거나 4 배 낮은 행을 필터링하고 싶습니다 .

이것을 달성하는 방법?

답변

1 akrun Nov 28 2020 at 05:10

'CD44low_rep'열에 8과 4를 곱한 다음 >=<=각각을 사용하여 관심있는 열과 비교하고를 사용하여 TRUE 값의 행별 합계를 구하고 rowSums3과 같은지 확인합니다 (즉, 비교 된 열 수). &두 비교에서 단일 논리 벡터를 반환하고이를 사용하여 행의 부분 집합

nm1 <- c("CD44hi_CD69low_rep",  "CD44hi_CD69hi_CD103low_rep", 
         "CD44hi_CD69hi_CD103hi_rep")
i1 <- (rowSums(df1[nm1]  >= (df1$CD44low_rep * 8)) == 3) & (rowSums(df1[nm1] <= (df1$CD44low_rep * 4)) == 3)

df1[i1,]
# A tibble: 798 x 5
#   tracking_id   CD44low_rep CD44hi_CD69low_rep CD44hi_CD69hi_CD103low_rep CD44hi_CD69hi_CD103hi_rep
#   <chr>               <dbl>              <dbl>                      <dbl>                     <dbl>
# 1 1600014C23Rik           0                  0                          0                         0
# 2 1600019K03Rik           0                  0                          0                         0
# 3 1700006E09Rik           0                  0                          0                         0
# 4 1700010M22Rik           0                  0                          0                         0
# 5 1700011A15Rik           0                  0                          0                         0
# 6 1700016P04Rik           0                  0                          0                         0
# 7 1700018G05Rik           0                  0                          0                         0
# 8 1700019A02Rik           0                  0                          0                         0
# 9 1700024B18Rik           0                  0                          0                         0
#10 1700024G13Rik           0                  0                          0                         0
# … with 788 more rows

또는를 사용하여 dplyr관심있는 열을 반복하여 동일한 표현식을 사용합니다 across(기본적으로 all열을 확인합니다 ).

library(dplyr)
df1 %>%
     filter(across(contains('hi'), ~ (. >= (CD44low_rep * 8)) & 
                (. <= (CD44low_rep * 4))))

-산출

# A tibble: 798 x 5
#   tracking_id   CD44low_rep CD44hi_CD69low_rep CD44hi_CD69hi_CD103low_rep CD44hi_CD69hi_CD103hi_rep
#   <chr>               <dbl>              <dbl>                      <dbl>                     <dbl>
# 1 1600014C23Rik           0                  0                          0                         0
# 2 1600019K03Rik           0                  0                          0                         0
# 3 1700006E09Rik           0                  0                          0                         0
# 4 1700010M22Rik           0                  0                          0                         0
# 5 1700011A15Rik           0                  0                          0                         0
# 6 1700016P04Rik           0                  0                          0                         0
# 7 1700018G05Rik           0                  0                          0                         0
# 8 1700019A02Rik           0                  0                          0                         0
# 9 1700024B18Rik           0                  0                          0                         0
#10 1700024G13Rik           0                  0                          0                         0
# … with 788 more rows