Присутствие / отсутствие data.frame после матча - PullRequest
0 голосов
/ 01 октября 2018

У меня есть огромный data.frame, который выглядит следующим образом:

  Gene     Sample1     Sample2      Sample3    .....
   A         0.34        0.99          1
   B         1.3         9.4           67
   D          13         2             284
   H         456         0.11          0.22
   G          0          32            0.8             
    ............

12.000 строк и 150 столбцов.

И еще один вектор:

       Measurements    
           0.8
           0.34
           0.22
            1
           32        

Я просто хотел бы сопоставить вектор с каждым столбцом data.frame и получить окончательный кадр данных, который выглядит какthis:

 Gene     Sample1     Sample2      Sample3    .....
   A         0.34        NA           1
   B          NA         NA           NA
   D          NA         NA           NA
   H          NA         NA          0.22
   G          NA         32          0.8        

NA - это значения, которые не находятся в векторе.

Может кто-нибудь помочь мне, пожалуйста?

Заранее спасибо

Б.

1 Ответ

0 голосов
/ 01 октября 2018

Вы можете сравнить каждый столбец с if_else сравнением.Но, пожалуйста, будьте осторожны с такого рода сравнением чисел с плавающей точкой.В этом примере все работает нормально:

library(tidyverse)
tbl <- read_table2(
"Gene     Sample1     Sample2      Sample3
A         0.34        0.99          1
B         1.3         9.4           67
D          13         2             284
H         456         0.11          0.22
G          0          32            0.8"
)
Measurements <- c(0.8, 0.34, 0.22, 1, 32)
tbl %>%
  mutate_at(vars(-Gene), ~if_else(. %in% Measurements, ., NA_real_))
#> # A tibble: 5 x 4
#>   Gene  Sample1 Sample2 Sample3
#>   <chr>   <dbl>   <dbl>   <dbl>
#> 1 A        0.34      NA    1   
#> 2 B       NA         NA   NA   
#> 3 D       NA         NA   NA   
#> 4 H       NA         NA    0.22
#> 5 G       NA         32    0.8

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

(1.1-0.2) %in% c(0.9)
#> [1] FALSE

Вы можетесправьтесь с этим путем сопоставления символьных векторов вместо этого:

tbl %>%
  mutate_all(as.character) %>%
  mutate_at(vars(-Gene), ~if_else(. %in% as.character(Measurements), ., NA_character_))
#> # A tibble: 5 x 4
#>   Gene  Sample1 Sample2 Sample3
#>   <chr> <chr>   <chr>   <chr>  
#> 1 A     0.34    <NA>    1      
#> 2 B     <NA>    <NA>    <NA>   
#> 3 D     <NA>    <NA>    <NA>   
#> 4 H     <NA>    <NA>    0.22   
#> 5 G     <NA>    32      0.8

, но это связано с собственным набором проблем, поскольку численно эквивалентные строки не будут эквивалентны по символам.

"0.990" %in% c(0.99)
#> [1] FALSE

Создано в2018-10-01 пакетом Представ (v0.2.0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...