使用第三个值的频率作为值创建 2 个变量矩阵

create 2 variable matrix using as value the frequencies of a third value

在此处使用这些数据:

sample  Wu.gene bin other
N1  BA00001 Wolbachia   dontcare6
W30 BA00002 Entomo  dontcare4
N1  BA00002 Rhizobiales dontcare7
N15 BA00002 Rhizobiales dontcare6
W30 BA00004 Bacteriodetes   dontcare1
N15 BA00004 Bacteriodetes   dontcare2
W30 BA00005 Alistepes   dontcare1
N15 BA00005 Alistepes   dontcare1
N15 BA00006 Alistepes   dontcare1
W30 BA00006 Rumino  dontcare6
W30 BA00007 Wolbachia   dontcare6
W30 BA00015 Bacteriodetes   dontcare1
N1  BA00015 Rhizobiales2    dontcare6
N15 BA00015 Wolbachia   dontcare6
N1  BA00016 Entomo  dontcare3
W30 BA00016 Entomo  dontcare5
W30 BA00017 Alistepes   dontcare1
W30 BA00018 Rumino  dontcare6
N15 BA00019 Wolbachia   dontcare6
N15 BA00020 Rhizobiales dontcare6
N15 BA00021 Rhizobiales2    dontcare6
N15 BA00022 Entomo  dontcare6
N1  BA00025 Alistepes   dontcare1
W30 BA00025 Rhizobiales dontcare6
W30 BA00025 Rhizobiales dontcare6
N15 BA00025 Wolbachia   dontcare6
N1  BA00026 Rumino  dontcare6
N15 BA00026 Wolbachia   dontcare6
W30 BA00027 Rhizobiales2    dontcare6
N15 BA00031 Wolbachia   dontcare6
N15 BA00033 Wolbachia   dontcare6
N15 BA00033 Wolbachia   dontcare6
N15 BA00033 Wolbachia   dontcare6

我一直在尝试使用重塑库和 dcast 函数创建矩阵

想法是制作一个“bin”~“Wu.gene”矩阵(“https://www.mediafire.com/file/qv9tdnnvwac6xfe/fake_data/file”),但是要使用“sample”作为矩阵值。让我解释一下:

如果您查看 fake.data table,Wu.gene“BA00033”在容器“Wolbachia”中出现 3 次,并且所有 3 次都在同一个“N15”样本中.但是,Wu.gene“BA00016”在容器“Entomo”中出现了 2 次,但出现在 2 个不同的样本中:“N1”和“W30”。

我可以轻松构建一个 Wu.gene ~ bin 矩阵,它会显示 Wu.gene 在同一个 bin 中的次数(无论它是否在同一个样本中)

bin BA00016 BA00033
Entomo  2   0
Wolbachia   0   3

但我不能指定,而是我想要一个矩阵显示它在同一样本中出现的时间,看起来像这样

bin BA00016 BA00033
Entomo  2   0
Wolbachia   0   1

我试过了

fake<-read.table(fake_data, header=T)
dcast(data=fake, formula=bin ~ Wu.gene, value.var = "sample")

但它一直给我 Wu.gene ~ bin 的出现次数,我不知道如何指定我希望它查看值的“样本”列

任何帮助将不胜感激!

我认为您可以使用 fun.aggregate 来传递一个函数来应用,在这种情况下将是 uniqueN,即计算唯一值。

library(data.table)
dcast(setDT(fake), bin ~ Wu.gene, value.var = "sample", 
      fill = 0, fun.aggregate = uniqueN)

或使用pivot_wider

tidyr::pivot_wider(fake, names_from = Wu.gene, values_from = sample, 
                   values_fn = n_distinct, id_cols = bin, values_fill = 0)