首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按组划分的R子集

按组划分的R子集
EN

Stack Overflow用户
提问于 2018-08-10 19:04:48
回答 4查看 1.7K关注 0票数 1

我有以下data.frame:

代码语言:javascript
运行
复制
Name    Expr    FC  FDR
probe1  gene1   1   1.5 0.005
probe2  gene2   1   1.3 0.02
probe3  gene1   2   1.2 0.000003
probe4  gene4   3   1.8 0.5
probe5  gene5   4   1.9 0.00008
probe6  gene2   5   1.3 0.03
probe7  gene4   3   1.2 0.0001
probe8  gene8   10  1.3 0.01
probe9  gene8   11  1.8 0.01

有许多探针代表相同的基因。我只想根据FDR为每个基因选择一个探针,即为每个基因选择具有最小FDR的探针。如果同一基因的两个探针具有相同的FDR,则随机选择一个。我希望有以下data.frame作为输出:

代码语言:javascript
运行
复制
Name    Expr    FC  FDR
probe3  gene1   2   1.2 0.000003
probe4  gene5   4   1.9 0.00008
probe6  gene4   3   1.2 0.0001
probe2  gene2   1   1.3 0.02
probe8  gene8   10  1.3 0.01

提前感谢您的帮助!

EN

回答 4

Stack Overflow用户

发布于 2018-08-10 19:14:28

使用dplyr,您可以:

代码语言:javascript
运行
复制
df <- read.table(text = "
Name    Expr    FC   FDR
probe1  gene1   1   1.5 0.005
probe2  gene2   1   1.3 0.02
probe3  gene1   2   1.2 0.000003
probe4  gene4   3   1.8 0.5
probe5  gene5   4   1.9 0.00008
probe6  gene2   5   1.3 0.03
probe7  gene4   3   1.2 0.0001
probe8  gene8   10  1.3 0.01
probe9  gene8   11  1.8 0.01", h= T)

library(dplyr)
df %>% 
  group_by(Name) %>% 
  slice(which.min(FDR))

在Andre Elrico的评论之后更新:

如果您想在平局情况下采样1行,则可以这样做,以获得最少的for。

代码语言:javascript
运行
复制
df %>% 
  group_by(Name) %>% 
  filter(FDR == min(FDR)) %>% 
  sample_n(1)
票数 3
EN

Stack Overflow用户

发布于 2018-08-10 19:13:53

(我认为反对票在这里有点苛刻: OP提供了样本数据和清晰的问题陈述。)

有很多方法可以做到这一点,我鼓励你在这里花一些时间研究类似的问题。你会学到很多关于聚合/汇总数据的知识。

下面是使用split的基本R可能性

代码语言:javascript
运行
复制
do.call(rbind, lapply(split(df, df$Name), function(df) df[which.min(df$FDR), ]))
#       Name Expr  FC   FDR
#gene1 gene1    2 1.2 3e-06
#gene2 gene2    1 1.3 2e-02
#gene4 gene4    3 1.2 1e-04
#gene5 gene5    4 1.9 8e-05
#gene8 gene8   10 1.3 1e-02

或者使用by (感谢@RuiBarradas)

代码语言:javascript
运行
复制
do.call(rbind, by(df, df$Name, function(x) x[which.min(x$FDR), ]))
   #    Name Expr  FC   FDR
#gene1 gene1    2 1.2 3e-06
#gene2 gene2    1 1.3 2e-02
#gene4 gene4    3 1.2 1e-04
#gene5 gene5    4 1.9 8e-05
#gene8 gene8   10 1.3 1e-02

样本数据

代码语言:javascript
运行
复制
df <- read.table(text =
    "Name    Expr    FC  FDR
probe1  gene1   1   1.5 0.005
probe2  gene2   1   1.3 0.02
probe3  gene1   2   1.2 0.000003
probe4  gene4   3   1.8 0.5
probe5  gene5   4   1.9 0.00008
probe6  gene2   5   1.3 0.03
probe7  gene4   3   1.2 0.0001
probe8  gene8   10  1.3 0.01
probe9  gene8   11  1.8 0.01", header = T)
票数 2
EN

Stack Overflow用户

发布于 2018-08-10 19:20:26

data.table解决方案:

代码语言:javascript
运行
复制
library(data.table)
setDT(df)

df[order(FDR), .SD[1], Name]
    Expr   Name FC FC2   FDR
1: gene1 probe3  2 1.2 3e-06
2: gene5 probe5  4 1.9 8e-05
3: gene4 probe7  3 1.2 1e-04
4: gene8 probe8 10 1.3 1e-02
5: gene2 probe2  1 1.3 2e-02

其中:

代码语言:javascript
运行
复制
df <- data.frame(
  Name = paste0("gene", c(1, 2, 4, 5, 8))[c(1, 2, 1, 3, 4, 2, 3, 5, 5)], 
  Expr = c(1L, 1L, 2L, 3L, 4L, 5L, 3L, 10L, 11L), 
  FC = c(1.5, 1.3, 1.2, 1.8, 1.9, 1.3, 1.2, 1.3, 1.8), 
  FDR = c(0.005, 0.02, 3e-06, 0.5, 8e-05, 0.03, 1e-04, 0.01, 0.01)
) 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51785124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档