фильтровать строки, которые имеют либо или определенные сгибы

#r

#r

Вопрос:

Я все еще изучаю R, у меня есть этот набор данных, в нем 5 столбцов, первый столбец — tracking_id, следующие четыре столбца имеют значения из четырех групп.

Я хочу отфильтровать строки после сравнения последних трех столбцов («CD44hi_CD69low_rep», «CD44hi_CD69hi_CD103low_rep», «CD44hi_CD69hi_CD103hi_rep»), которые в 8 раз больше или в 4 раза меньше по сравнению со столбцом («CD44low_rep»).

Как этого добиться?

Комментарии:

1. Все столбцы @akrun

Ответ №1:

Мы умножаем столбец ‘CD44low_rep’ на 8 и 4, затем сравниваем его с интересующими столбцами, используя >= и <= , соответственно, получаем сумму ИСТИННЫХ значений по rowSums строкам, проверяем, равно ли оно 3 (т.Е. Количество сравниваемых столбцов), используем amp; для возврата одного логического вектора из обоих сравнений,и используйте это для подмножества строк

 nm1 <- c("CD44hi_CD69low_rep",  "CD44hi_CD69hi_CD103low_rep", 
         "CD44hi_CD69hi_CD103hi_rep")
i1 <- (rowSums(df1[nm1]  >= (df1$CD44low_rep * 8)) == 3) amp;
     (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)) amp; 
                (. <= (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
 

Комментарии:

1. @user432797 теперь это должно сработать. Я внес изменение и забыл изменить его здесь

2. @user432797 если вы проверяете только первое условие, то есть 18 строк df2 %>% filter(across(contains('hi'), ~ (. >= (CD44low_rep * 8)))) , в которых df2 является отфильтрованным. Затем, когда вы объединяете со вторым, у вас может не быть общего случая. Может быть, вам нужно | условие вместо amp;

3. @user432797, если это условие ИЛИ df2 %>% filter((across(contains('hi'), ~ (. >= (CD44low_rep * 8))))| (across(contains('hi'), ~ (. <= (CD44low_rep * 4)))))

4. @user432797 Я думаю, это | потому, что вы не можете одновременно выполнять оба условия для одной и той же строки.

5. @user432797 когда вы публикуете вопрос, можете ли вы привести небольшой пример и его ожидаемый результат, чтобы нам было легче его отслеживать