按名称自动调用值

时间:2013-12-20 20:29:03

标签: r

我有一个列表Frequencies,其中包含每个值的名称数据。名称是基因座名称(小数点前)和等位基因数字(小数点后面)的组合。我正在尝试进行一系列的计算,如下所示:

expD12 <- (1-((Freqs[["D12S391.14"]])^2+(Freqs[["D12S391.15"]])^2+ (Freqs[["D12S391.16"]])^2+
(Freqs[["D12S391.17"]])^2+(Freqs[["D12S391.17.1"]])^2+(Freqs[["D12S391.17.3"]])^2+
(Freqs[["D12S391.18"]])^2+(Freqs[["D12S391.18.1"]])^2+(Freqs[["D12S391.18.3"]])^2+
(Freqs[["D12S391.19"]])^2+(Freqs[["D12S391.19.1"]])^2+(Freqs[["D12S391.19.3"]])^2+
(Freqs[["D12S391.20"]])^2+(Freqs[["D12S391.20.1"]])^2+(Freqs[["D12S391.20.3"]])^2+
(Freqs[["D12S391.21"]])^2+(Freqs[["D12S391.22"]])^2+(Freqs[["D12S391.22.2"]])^2+
(Freqs[["D12S391.23"]])^2+(Freqs[["D12S391.24"]])^2+(Freqs[["D12S391.24.3"]])^2))

虽然这段代码完成了我需要它做的事情,但有没有一种更简洁的方法来执行此操作,可能涉及for循环并按名称调用每个值,直到它达到小数点前的名称,这是不同的?我问这个是因为我必须为多个数据集的多个基因座执行相同的计算。非常感谢!

2 个答案:

答案 0 :(得分:0)

您可以尝试:

locus_name <- "D12S391"
1 - sum(unlist(Freqs[grepl(locus_name, names(Freqs))])^2)

此计算将包括某个locus_name的所有等位基因。

答案 1 :(得分:0)

如果你包含一个可重复的例子会更好;这是一个镜头:

Freqs = list(D12S391.14=.1, D12S391.15=.2, D12S392.14=.3, D12S392.15=.4)

您可以使用以下内容获取所有基因座名称:

locuses = unique(unlist(lapply(strsplit(names(Freqs), ".", fixed=TRUE),
                               function(x) x[1])))

然后你可以使用像Sven列出的函数来计算你想要的每个基因座名称的值:

sapply(locuses, function(x) 1 - sum(unlist(Freqs[grepl(x, names(Freqs))])^2))
# D12S391 D12S392 
#    0.95    0.75