R 如何通过改变值来选择每组的行?
我有一个数据集,看起来像:R 如何通过改变值来选择每组的行?,r,dplyr,R,Dplyr,我有一个数据集,看起来像: Group Gene Score direct_count secondary_count SD_per_group 1 AQP11 0.31 4 5 0.12 1 CLNS1A 0.27 0 2 0.12 1 RSF1 0.49 3
Group Gene Score direct_count secondary_count SD_per_group
1 AQP11 0.31 4 5 0.12
1 CLNS1A 0.27 0 2 0.12
1 RSF1 0.49 3 6 0.12
2 CFDP1 0.58 1 2 0.02
2 CHST6 0.59 1 3 0.02
2 UBL 0.56 1 3 0.02
3 ACE 0.634 1 1 0.001
3 NOS2 0.6345 1 1 0.001
4 Gene1 0.1 10 20 0.45
4 Gene2 0.68 3 1 0.45
4 Gene3 0.7 0 1 0.45
5 AGT 0.75 0 0 0.00
如果在每个过滤步骤中选择了超过1个基因,我会根据其得分
和直接计数
以及次要计数
选择每个组中的特定基因
我试图在第一个筛选步骤中选择每个组的一个基因,如果与组中的其他基因相比,每个组的最高得分>SD\u
得分(如果选择了多个基因,我会根据count
列选择基因,如果它们也有匹配的直接和次要计数列,则每组只保留几个基因)
我将其编码为:
new_df <- df %>%
group_by(Group) %>%
filter((max(Score) - Score)<SD_per_group) %>%
slice_max(direct_count, n = 1) %>%
slice_max(secondary_count, n = 1) %>%
ungroup()
预期产出:
Group Gene Score direct_count secondary_count SD_per_group
1 RSF1 0.4900 3 6 0.120 #highest score >SD_per_group
2 CHST6 0.5900 1 3 0.020 #highest secondary count
3 ACE 0.6340 1 1 0.001 #ACE and NOS2 <SD diff and matching both counts
3 NOS2 0.6345 1 1 0.001
4 Gene2 0.6800 3 1 0.450 #highest direct count
5 AGT 0.75 0 0 0.00 #only gene in the group so must be selected
组基因得分直接计数次要计数SD每组
1 RSF1 0.4900 3 6 0.120#最高得分>SD#U每组
2 CHST6 0.5900 1 3 0.020最高二次计数
3 ACE 0.6340 1 1 0.001#ACE和NOS2如果我正确理解您所需的逻辑,您想保留该组只有一行的任何行吗
如果是这样,您可以向筛选器中添加或语句,以保留每行中只有1个数量(即n()==1
)的行:
代码
new_df <- df %>%
group_by(Group) %>%
filter((max(Score) - Score)<SD_per_group | n() == 1) %>%
slice_max(direct_count, n = 1) %>%
slice_max(secondary_count, n = 1) %>%
ungroup()
new_df%
分组依据(分组)%>%
过滤器(最大(分数)-分数%
切片最大值(直接计数,n=1)%>%
切片最大值(二次计数,n=1)%>%
解组()
输出
> new_df
# A tibble: 6 x 6
Group Gene Score direct_count secondary_count SD_per_group
<int> <chr> <dbl> <int> <int> <dbl>
1 1 RSF1 0.49 3 6 0.12
2 2 CHST6 0.59 1 3 0.02
3 3 ACE 0.634 1 1 0.001
4 3 NOS2 0.634 1 1 0.001
5 4 Gene2 0.68 3 1 0.45
6 5 AGT 0.75 0 0 0
>新的
#一个tibble:6x6
组基因得分直接计数次要计数SD每组
1 RSF1 0.49 36 0.12
2 CHST6 0.59 1 3 0.02
3 ACE 0.634 1 0.001
4 3 NOS2 0.634 1 0.001
5 4 Gene2 0.68 3 1 0.45
6 5 AGT 0.75 0 0
如果我正确理解了您所需的逻辑,您想保留该组只有一行的任何行吗
如果是这样,您可以向筛选器中添加或语句,以保留每行中只有1个数量(即n()==1
)的行:
代码
new_df <- df %>%
group_by(Group) %>%
filter((max(Score) - Score)<SD_per_group | n() == 1) %>%
slice_max(direct_count, n = 1) %>%
slice_max(secondary_count, n = 1) %>%
ungroup()
new_df%
分组依据(分组)%>%
过滤器(最大(分数)-分数%
切片最大值(直接计数,n=1)%>%
切片最大值(二次计数,n=1)%>%
解组()
输出
> new_df
# A tibble: 6 x 6
Group Gene Score direct_count secondary_count SD_per_group
<int> <chr> <dbl> <int> <int> <dbl>
1 1 RSF1 0.49 3 6 0.12
2 2 CHST6 0.59 1 3 0.02
3 3 ACE 0.634 1 1 0.001
4 3 NOS2 0.634 1 1 0.001
5 4 Gene2 0.68 3 1 0.45
6 5 AGT 0.75 0 0 0
>新的
#一个tibble:6x6
组基因得分直接计数次要计数SD每组
1 RSF1 0.49 36 0.12
2 CHST6 0.59 1 3 0.02
3 ACE 0.634 1 0.001
4 3 NOS2 0.634 1 0.001
5 4 Gene2 0.68 3 1 0.45
6 5 AGT 0.75 0 0
您可以使用if-else包含这两个过滤选项
df %>% group_by(Group) %>% filter(if(n() > 1) {(max(Score) - Score) < SD_per_group} else TRUE) %>%
slice_max(direct_count, n = 1) %>%
slice_max(secondary_count, n = 1) %>%
ungroup()
# A tibble: 6 x 6
Group Gene Score direct_count secondary_count SD_per_group
<int> <chr> <dbl> <int> <int> <dbl>
1 1 RSF1 0.49 3 6 0.12
2 2 CHST6 0.59 1 3 0.02
3 3 ACE 0.634 1 1 0.001
4 3 NOS2 0.634 1 1 0.001
5 4 Gene2 0.68 3 1 0.45
6 5 AGT 0.75 0 0 0
>
df%>%group\u by(group)%>%filter(如果(n()>1){(max(Score)-Score)%
切片最大值(直接计数,n=1)%>%
切片最大值(二次计数,n=1)%>%
解组()
#一个tibble:6x6
组基因得分直接计数次要计数SD每组
1 RSF1 0.49 36 0.12
2 CHST6 0.59 1 3 0.02
3 ACE 0.634 1 0.001
4 3 NOS2 0.634 1 0.001
5 4 Gene2 0.68 3 1 0.45
6 5 AGT 0.75 0 0
>
您可以使用if-else包含这两个过滤选项
df %>% group_by(Group) %>% filter(if(n() > 1) {(max(Score) - Score) < SD_per_group} else TRUE) %>%
slice_max(direct_count, n = 1) %>%
slice_max(secondary_count, n = 1) %>%
ungroup()
# A tibble: 6 x 6
Group Gene Score direct_count secondary_count SD_per_group
<int> <chr> <dbl> <int> <int> <dbl>
1 1 RSF1 0.49 3 6 0.12
2 2 CHST6 0.59 1 3 0.02
3 3 ACE 0.634 1 1 0.001
4 3 NOS2 0.634 1 1 0.001
5 4 Gene2 0.68 3 1 0.45
6 5 AGT 0.75 0 0 0
>
df%>%group\u by(group)%>%filter(如果(n()>1){(max(Score)-Score)%
切片最大值(直接计数,n=1)%>%
切片最大值(二次计数,n=1)%>%
解组()
#一个tibble:6x6
组基因得分直接计数次要计数SD每组
1 RSF1 0.49 36 0.12
2 CHST6 0.59 1 3 0.02
3 ACE 0.634 1 0.001
4 3 NOS2 0.634 1 0.001
5 4 Gene2 0.68 3 1 0.45
6 5 AGT 0.75 0 0
>