在r

时间:2016-04-08 06:38:15

标签: r igraph

我有一个包含不同组的列表,每个组都有一些元素;例如

>lst
grup   name
A      cancer
A      diabetes
A      Alzheimer's
A      Carcinoma
A      Lung Diseases
A      Adenoma
A      Hyperplasia
B      Cortical
B      Aortic Aneurysm
B      Asthma
E      Pneumonia
E      Asthma

现在我想要所有可能的成对元素来自组' A',' B'等等。 A' A'所以我想要的对就像(癌症,糖尿病),(癌症,阿尔茨海默氏症),(癌症,癌症),(癌症,肺病),(癌症,腺瘤),(癌症,增生),糖尿病和群体的所有元素' A'比同组' B'和' E'。简而言之,每个元素对与该组的每个元素相对应。我尝试了下面的代码,但它没有给我正确的答案,它给了列表一些缺少的元素。

代码:

spt <- split(lst, lst$name)# split the list into group
dis_name <- lapply(1:length(spt), function(x) as.character(spt[[x]][[2]]))
pr <- list()
for(k in 1:length(dis_name))
{
  grp <- dis_name[[k]]
  l <- length(grp)

  for(m in 1:l)
  {
    for(p in 1:l)
    {

      pr[m][p] <- list(NULL) 
      cm <- paste(grp[m],",", grp[p])
      pr[[m]][[p]] <- list(cm = cm) 
    }

  }
}

PR

这有什么问题我无法理解。这是我的数据的一个小例子,我有大量数据,所以如果我想并行运行它而不是如何使用包foreachdoSNOW运行它。请帮助,任何帮助表示赞赏。谢谢。

我想要的输出是:

[[1]]
[[1]][[2]]
"cancer , diabetes"
[[1]][[3]]
"cancer , Alzheimer's"
[[1]][[4]]
"cancer , Carcinoma"
[[1]][[5]]
"cancer , Lung Diseases"
[[1]][[6]]
"cancer , Adenoma"
[[1]][[7]]
"cancer , Hyperplasia"
[[2]]
[[2]][[1]]
"diabets , cancer"
[[2]][[3]]
"diabetes , Alzheimer's"
.
.
.
[[2]][[7]]
"diabetes , Hyperplasia"
[[3]]
[[3]][[1]]
"Alzheimer's , cancer"
.
.
.
[[3]][[7]]
"Alzheimer's , Hyperplasia"
[[4]]
[[4]][[1]]
.
.
.
[[4]][[7]]
[[5]]
[[5]][[1]]
.
.
.
[[5]][[7]]
[[6]]
[[6]][[1]]
.
.
.
[[7]]
[[7]][[1]]
.
.
.

同样的&#39; B&#39;和&#39; C&#39;

[[2]]
[[1]]
[[1]][[2]]
"Cortical , Aortic Aneurysm"
[[1]][[3]]
"Cortical , Asthma"
[[2]]
[[2]][[1]]
"Aortic Aneurysm , Cortical"
[[2]][[3]]
"Aortic Aneurysm , Asthma"
[[3]]
[[3]][[1]]
.
.
[[3]][[2]]
[[3]]
[[1]]
[[1]][[2]]
"Pneumonia , Asthma"
[[2]]
[[2]][[1]]
"Asthma , Pneumonia"

我的输出看起来像这样,但名称保持相同但只有订单会改变的那对被认为是一个说法:

"Asthma , Pneumonia"

与...相同     &#34;肺炎,哮喘&#34; 所以认为它是一对。 感谢。

你好再次,在这里我发布了我的数据的一小部分,下面给出的解决方案无法正常工作我无法理解什么是错的,因为我之前给出的例子与我的真实数据相同仍然是lapply不工作并给出了错误请帮忙。我真的很感激任何帮助。我正在尝试解决错误,但我无法解决。

 sort_gene:
 data.geneSymbol    data.diseaseName
 A2M                Acute Kidney Injury
 A2M                Adenoma, Liver Cell
 A2M                Alzheimer Disease
 A2M                Carcinoma, Hepatocellular
 A2M                Colonic Neoplasms
 A2M                Lung Diseases
 A2M                Lung Neoplasms
 A2M                Nephrotic Syndrome
 A4GALT             Blood group antigen p
 A4GALT             Burkitt Lymphoma
 A4GALT             Hyperostosis, Cortical, Congenital
 AAA1               Aortic Aneurysm, Familial Abdominal 1
 AAA2               Aortic Aneurysm, Familial Abdominal 2

Error:Error in FUN(X[[i]], ...) : n < m

请让我离开这个。我真的需要帮助。感谢

2 个答案:

答案 0 :(得分:1)

我认为这可以满足您的需求。第二行基本上是nicola建议的,第三行是输出格式。

lst <- data.frame(grup = c(rep("A", 7), rep("B", 3), "E", "E"), name = c("cancer", "diabetes", "Alzheimer's", "Carcinoma", "Lung Diseases", "Adenoma", "Hyperplasia", "Cortical", "Aortic Aneurysm", "Asthma", "Pneumonia", "Asthma"))
output <- lapply(split(lst$name, lst$grup), combn, 2, simplify = F)
output <- lapply(output, function(x) lapply(x, as.character))

然后将每对变为单个字符串而不是向量,并计算每对的频率:

output <- lapply(output, function(x) lapply(x, paste, collapse = " "))
table(unlist(output))

答案 1 :(得分:1)

试试这个(lst来自Dan Lewer的答案):

setNames(lapply(split(lst$name, lst$grup),
         function(x) combn(x,2,simplify=FALSE,FUN=paste,collapse=" , ")),NULL)
#[[1]]
#[[1]][[1]]
#[1] "cancer , diabetes"
#
#[[1]][[2]]
#[1] "cancer , Alzheimer's"
#
#[[1]][[3]]
#[1] "cancer , Carcinoma"
#...