例如,我有一个包含许多列和行的数据框
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,这对我来说似乎是一个很大的挑战。我很乐意为您提供帮助。 非常感谢你!
答案 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)