在 r 中创建一对列表元素
Create a pair of list element in r
我有一个包含不同组的列表,每个组都有一些元素;例如
>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' 中有七个元素,所以我想要的对是 (cancer, diabetes), (cancer, Alzheimer'), (cancer,Carcinoma), (cancer, Lung Disease), (cancer, Adenoma), (癌症,增生)对于糖尿病和 '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
我不明白这是怎么回事。这是我的数据的一个小例子,我有大量的数据,所以如果我想 运行 它与如何 运行 它与包 foreach
和 doSNOW
并行。请帮助,任何帮助表示赞赏。谢谢。
我想要的输出是:
[[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]]
.
.
.
'B' 和 'C'
的元素相同
[[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"
与
"Pneumonia , Asthma"
所以把它当作一对。
谢谢。
再次您好,我在这里发布了我的一小部分数据,下面给出的解决方案对其不起作用我不明白出了什么问题,因为我之前给出的示例与我的真实数据相同仍然 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
请让我离开这里。我真的需要帮助。谢谢
我认为这可以满足您的需求。第二行基本上是尼古拉建议的,第三行格式化输出。
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))
试试这个(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"
#...
我有一个包含不同组的列表,每个组都有一些元素;例如
>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' 中有七个元素,所以我想要的对是 (cancer, diabetes), (cancer, Alzheimer'), (cancer,Carcinoma), (cancer, Lung Disease), (cancer, Adenoma), (癌症,增生)对于糖尿病和 '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
我不明白这是怎么回事。这是我的数据的一个小例子,我有大量的数据,所以如果我想 运行 它与如何 运行 它与包 foreach
和 doSNOW
并行。请帮助,任何帮助表示赞赏。谢谢。
我想要的输出是:
[[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]]
.
.
.
'B' 和 'C'
的元素相同[[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"
与 "Pneumonia , Asthma" 所以把它当作一对。 谢谢。
再次您好,我在这里发布了我的一小部分数据,下面给出的解决方案对其不起作用我不明白出了什么问题,因为我之前给出的示例与我的真实数据相同仍然 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
请让我离开这里。我真的需要帮助。谢谢
我认为这可以满足您的需求。第二行基本上是尼古拉建议的,第三行格式化输出。
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))
试试这个(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"
#...