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

R 如何在所有列中比较两行(由定义的条件选择)?,r,select,compare,row,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

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

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的,这对我来说似乎是一个很大的挑战。如果能在我的问题上得到任何帮助,我将不胜感激。
多谢各位

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

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
库(dplyr)
df%%>%arrange(ID)%%>%#按升序排列ID
分组依据(ID)%>%#分组依据ID
#在除ID和组之外的所有列上进行变异
在(变量(-ID,-Group),~replace(,all([Group==1]==0)| all([Group==2]==0),NA)处进行变异
#一个tibble:8x9
#组别:ID[3]
ID组A B C D E F G
1 10.1 NA 0.5 NA NA NA
2 1 10 NA 0 NA NA NA NA
3 1 2 0.2 NA 0.2 NA NA NA
4 1 2 0 NA 0.8 NA NA NA
5 2 1 0.1 NA 0.7 NA 0.3
620.1Na0.1Na0.1Na0.1
7 3 2 NA 0.1 NA 0.2 NA
8 3 1钠0.5钠0.6钠
资料


df非常感谢您编辑我的问题。现在看起来很专业。
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)