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)