首页 > 解决方案 > 在R中使用多个模拟条件子集数据帧

问题描述

这是我的数据的一个代表性子集:

> df
  Sample  Circle      Value
1     a1     C27 0.04829484
2     a2     C27 0.10577841
3     a1     C18 0.03977222
4     a2     C18 0.10319845
5     a1     C16 0.03977222
6     a2     C16 0.03095953

我想:

1) 计算每个圆的最大 $Value。有三个圆圈,所以我总共会得到 3 个最大值。我用了 :

Max_df = df %>% group_by(Circle) %>% do(data.frame(Max_value = max(.$Value)))

> Max_df
# A tibble: 3 x 2
# Groups:   Circle [3]
  Circle  Max_value
  <chr>       <dbl>
1 C18        0.10319845 
2 C27        0.10577841 
3 C16        0.03977222

所以它可以工作,但它不会保留有关哪个 $Sample(a1 或 a2)具有最大值的信息。你知道怎么做吗?

2) 计算每个圆的第二个最大值。我不能使用min(),因为我的真实数据集中有更多的样本和圆圈。我试图做的是使用 Max_df 过滤掉具有 df 最大值的行。然后计算这个过滤后的df的最大值。所以它与 1) 中的代码相同。

但是,我没有成功过滤掉保存在 Max_Df 中的最大值的行。我试过了 :

filter(df, Circle %in% Max_df$Circle & Value %in% Max_df$Max_Value)

问题是这段代码保留了 df 的第三行,因为它的 Value 等于 C16 的最大值(第 5 行)。而第三行绝对不是圆C18的最大值。

那么如何根据两个同时条件过滤一个表呢?

标签: r

解决方案


试试这个filter()解决方案:

library(dplyr)

#given dataset
df <- data.frame(Sample = rep(c("a1", "a2"), 3),
                 Circle = c("C27", "C27", "C18", "C18", "C16", "C16"),
                 Value = c(0.04829484, 0.10577841, 0.03977222,
                           0.10319845, 0.03977222, 0.03095953))

#(1)
Max_df <- df %>%
  group_by(Circle) %>%
  filter(Value == max(Value))

#(2)
Second_df <- df %>%
  group_by(Circle) %>%
  filter(Value != max(Value)) %>%
  filter(Value == max(Value))

#(1+2)
Both_df <- Max_df %>%
  rbind(Second_df)

或者这个rank()解决方案

#Adding ranks to df
Rank_df <- df %>%
  group_by(Circle) %>%
  mutate(Value_rank = rank(-Value, ties.method = "first")) 

#(1)
Max_df2 <- Rank_df %>%
  filter(Value_rank == 1) %>%
  select(-Value_rank)

#(2)
Second_df2 <- Rank_df %>%
  filter(Value_rank == 2) %>%
  select(-Value_rank)

#(1+2) - step (1) and (2) are not required
Both_df2 <- Rank_df %>%
  filter(Value_rank %in% 1:2) %>%
  select(-Value_rank)

推荐阅读