首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按组提取表的前10个值,其中组位于表的y轴上

按组提取表的前10个值,其中组位于表的y轴上
EN

Stack Overflow用户
提问于 2019-09-17 19:02:50
回答 1查看 122关注 0票数 2

这个问题与按组选择顶N值非常相似,但我似乎无法解决这个问题。我有一个大的频率表,有3列和50多行。每一行都是独立的,可能对特定列具有相同的值。示例:

代码语言:javascript
复制
       CD     Freq    sample
 express 1    0.2        A
 express 2    0.7        A
 express 2    0.5        B
 express 3    0.1        B
 express 4    0.9        A
 express 4    0.3        C
 express 5    0.8        B
 express 5    0.1        C

我想为每个样本生成一个“前10”频率表,其中行由每个CD合并,列是每个样本(A、B、C等),而在交集中则是频率。示例:

代码语言:javascript
复制
             A    B    C
express 1   0.2   0    0
express 2   0.7  0.5   0
express 3   0    0.1   0
express 4   0.3   0    0.9
express 5   0     0.8  0.1

我已经生成了原始表并可以进行排序,但是我不知道如何聚合频率并将它们逐个列在列中。但这就是我所能掌握的新手技能的全部。任何帮助都是非常感谢的。

代码语言:javascript
复制
data <- vdj.data %>% map_dfr(read_delim, "\t", escape_double = FALSE, trim_ws = TRUE, .id ="source") %>% mutate(source = str_replace(basename(source), ".txt", ""))
data <- vdj.data %>% select(freq, cd, "file"= source)


require(data.table)
d <- data.table(vdj.data, key="cd")

top <- d[, head(.SD, 10), by=cd]

预期输出应该只显示每个样本中前十的表达式,因此可能需要合并一些快递,例如,我想选择前2,而不是前10。我会制作表格:

代码语言:javascript
复制
                        A       B       C
            express 2   0.7    0.5     0
            express 4   0.9     0       0.3
            express 5   0       0.8     0.1

所以正如你所看到的,快递1和特快3被丢弃,因为没有样本将它作为前2频率。A的前2位是快递2和4的,B的前2位是快递2和5的,最后,样本C的前2位是表达式4和5。

我希望这有助于澄清。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-17 20:04:06

利用dplyrreshape2,按组求出顶N,再由长到宽进行转换。请随意使用您最喜欢的从常见问题到广泛性方法

代码语言:javascript
复制
n = 2
df %>% group_by(sample) %>%
  arrange(desc(Freq)) %>% 
  slice(1:n) %>% 
  reshape2::dcast(CD ~ sample, value.var = "Freq", fill = 0)
#          CD   A   B   C
# 1 express 2 0.7 0.5 0.0
# 2 express 4 0.9 0.0 0.3
# 3 express 5 0.0 0.8 0.1

在任何地方保持最高地位:

代码语言:javascript
复制
df %>% group_by(sample) %>%
  arrange(desc(Freq)) %>%
  slice(1:n) %>%
  ungroup %>%
  select(CD) %>% 
  inner_join(df) %>%
  reshape2::dcast(CD ~ sample, value.var = "Freq", fill = 0,
                  fun.aggregate = mean)

使用这些数据:

代码语言:javascript
复制
df = read.table(text = "       CD     Freq    sample
 'express 1'  0.2        A
 'express 2'    0.7        A
 'express 2'  0.5        B
 'express 3'    0.1        B
 'express 4'  0.9        A
 'express 4'    0.3        C
 'express 5'  0.8        B
 'express 5'    0.1        C", header = T)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57980547

复制
相关文章

相似问题

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