r - 在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的最大值。
那么如何根据两个同时条件过滤一个表呢?
解决方案
试试这个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)
推荐阅读
- javascript - 是否有可以产生 1/f(粉红噪声)波动的 node.js 模块?
- jquery - 用 replace() 在字符串的括号中只保留一个数字
- android - 移动应用程序可以在没有独立穿戴应用程序的情况下为表盘提供数据吗?
- python - 如何使python弹出窗口保持在顶部
- node.js - 如何在 React.js 中循环从服务器接收到的数据?
- java - 不在滚动视图中滚动
- python - 悬停数据并单击 dash_table 上的数据
- php - 如何从 WP 插件函数内部的外部 PHP 文件调用函数
- xpath - 如何解决动态 xpath(执行后 id 更改)
- r - 使用 mutate_at 通过使用同一数据框中的其他列来创建新列