这个问题与按组选择顶N值非常相似,但我似乎无法解决这个问题。我有一个大的频率表,有3列和50多行。每一行都是独立的,可能对特定列具有相同的值。示例:
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等),而在交集中则是频率。示例:
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我已经生成了原始表并可以进行排序,但是我不知道如何聚合频率并将它们逐个列在列中。但这就是我所能掌握的新手技能的全部。任何帮助都是非常感谢的。
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。我会制作表格:
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。
我希望这有助于澄清。
发布于 2019-09-17 20:04:06
利用dplyr和reshape2,按组求出顶N,再由长到宽进行转换。请随意使用您最喜欢的从常见问题到广泛性方法
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在任何地方保持最高地位:
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)使用这些数据:
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)https://stackoverflow.com/questions/57980547
复制相似问题