我有一个像这个例子的表:
breeds <- "tag Chr Position Breed
chr1-2157 1 2157 BRL
chr1-2157 1 2157 GOT
chr1-2157 1 2157 HED
chr1-2157 1 2157 KIN
chr2-2185 2 2185 BRL
chr2-2185 2 2185 GOT
chr2-2185 2 2185 HED
chr3-2189 3 2185 BRL"
breeds <-read.table(text=breeds,header=T)
我想构建一个这样的逻辑表:
final <- "tag BRL GOT HED KIN
chr1-2157 TRUE TRUE TRUE TRUE
chr2-2185 TRUE TRUE TRUE FALSE
chr3-2189 TRUE FALSE FALSE FALSE"
final <-read.table(text=final,header=T)
最后对群组进行分类:
我们的想法是能够计算可能的&#34; true&#34;的唯一标签的数量。和&#34;假&#34;组最终使用venneuler
包(Venn diagram proportional and color shading with semi-transparency)将每个组的编号包含在维恩图中
答案 0 :(得分:3)
您可以使用table
函数以及逻辑比较来计算:
with(breeds, table(tag, Breed)) > 0
Breed
tag BRL GOT HED KIN
chr1-2157 TRUE TRUE TRUE TRUE
chr2-2185 TRUE TRUE TRUE FALSE
chr3-2189 TRUE FALSE FALSE FALSE
table
本身会产生频率计数。添加> 0
返回逻辑。 with
只是为了减少打字,可能有点清晰。
答案 1 :(得分:1)
table
肯定更容易。另一种方法是先将breeds
分割为tag
,然后再分割为Breed
,并计算每个子组中的行数。
t(sapply(split(breeds, breeds$tag), function(a)
sapply(split(a, a$Breed), function(b)
nrow(b)>0 )))
# BRL GOT HED KIN
#chr1-2157 TRUE TRUE TRUE TRUE
#chr2-2185 TRUE TRUE TRUE FALSE
#chr3-2189 TRUE FALSE FALSE FALSE
就像在lmo的解决方案中一样,您最初获得的是频率计数,并且添加>0
会返回逻辑。