Как сравнить две строки (выбранные по заданным условиям) по всему столбцу? - PullRequest
2 голосов
/ 16 мая 2019

У меня есть фрейм данных со многими столбцами и строками, например,

ID  Group A B   C   D   E   F   G   … 
1   1   0.1 0.0 0.5 0.0 0.9 0.0 0.0 …
2   1   0.1 0.0 0.0 0.7 0.0 0.0 0.3 …
3   2   0.0 0.1 0.6 0.0 0.0 0.2 0.0 …
1   1   0.0 0.0 0.0 0.0 0.0 0.0 0.0 …
3   1   0.0 0.5 0.0 0.0 0.0 0.6 0.0 …
1   2   0.2 0.1 0.2 0.0 0.0 0.0 0.1 …
2   2   0.1 0.1 0.1 0.1 0.1 0.1 0.1 …
1   2   0.0 0.2 0.8 0.0 0.0 1.3 1.1 …

Я хотел бы сравнить строки с одинаковым идентификатором во всем столбце от А до конца.В сравниваемых строках, если хотя бы одно значение из группы 1 не равно нулю, а хотя бы одно значение из группы 2 не равно нулю, запишите имя и значение этого столбца в таблицу.Таким образом, таблица вывода будет выглядеть следующим образом:

ID  Group A B   C   D   E   F   G   … 
1   1   0.1 NA  0.5 NA  NA  NA  NA  … 
1   1   0.0 NA  0.0 NA  NA  NA  NA  … 
1   2   0.2 NA  0.2 NA  NA  NA  NA  … 
1   2   0.0 NA  0.8 NA  NA  NA  NA  … 
2   1   0.1 NA  NA  0.7 NA  NA  0.3 … 
2   2   0.1 NA  NA  0.1 NA  NA  0.1 … 
3   2   NA  0.1 NA  NA  NA  0.2 NA  … 
3   1   NA  0.5 NA  NA  NA  0.6 NA  … 

Поскольку я новичок в использовании R, мне кажется, что это большая проблема.Буду признателен за любую помощь по моему вопросу.Большое спасибо!

1 Ответ

0 голосов
/ 16 мая 2019

Вот один вариант использования dplyr, он использует вашу логику, но, наоборот, я надеюсь, что он решит вашу проблему. Для данного столбца мы заменяем значения столбца для данного идентификатора на NA, когда все значения в группе 1 или 2 равны нулю.

library(dplyr)
df %>% arrange(ID) %>%   # arrange ID in ascending order
       group_by(ID) %>%  # group by ID
       #mutate at all columns except ID and Group
       mutate_at(vars(-ID,-Group), ~replace(.,all(.[Group==1]==0)|all(.[Group==2]==0),NA)) 

# A tibble: 8 x 9
# Groups:   ID [3]
      ID Group    A     B     C     D     E     F     G
     <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
  1     1     1   0.1  NA     0.5  NA      NA  NA    NA  
  2     1     1   0    NA     0    NA      NA  NA    NA  
  3     1     2   0.2  NA     0.2  NA      NA  NA    NA  
  4     1     2   0    NA     0.8  NA      NA  NA    NA  
  5     2     1   0.1  NA    NA     0.7    NA  NA     0.3
  6     2     2   0.1  NA    NA     0.1    NA  NA     0.1
  7     3     2  NA     0.1  NA    NA      NA   0.2  NA  
  8     3     1  NA     0.5  NA    NA      NA   0.6  NA

Данные

df <- read.table(text ="
ID  Group A B   C   D   E   F   G    
1   1   0.1 0.0 0.5 0.0 0.9 0.0 0.0 
                 2   1   0.1 0.0 0.0 0.7 0.0 0.0 0.3 
                 3   2   0.0 0.1 0.6 0.0 0.0 0.2 0.0 
                 1   1   0.0 0.0 0.0 0.0 0.0 0.0 0.0 
                 3   1   0.0 0.5 0.0 0.0 0.0 0.6 0.0 
                 1   2   0.2 0.1 0.2 0.0 0.0 0.0 0.1 
                 2   2   0.1 0.1 0.1 0.1 0.1 0.1 0.1 
                 1   2   0.0 0.2 0.8 0.0 0.0 1.3 1.1",
                           header = TRUE, stringsAsFactors = FALSE)
...