我有一个带有许多列和行的数据框架,例如
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的列值。
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)