如何比较所有列中的两行(按定义的条件选择)?

时间:2019-05-16 08:54:43

标签: r select compare row

例如,我有一个包含许多列和行的数据框

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 …

我想比较从A到末尾所有列中具有相同ID的行。在比较的行中,如果至少有一个来自组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 :(得分:0)

这里是使用dplyr的一个选项,它使用了您的逻辑,但相反,我希望它可以解决您的问题。对于给定的列,当组1或2中的所有值都等于零时,我们用NA替换给定ID的列值。

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)