首页 > 解决方案 > 如何在R中迭代作为子集的列表

问题描述

我对 R 很陌生并且有一些问题。我有一个大约 6700 行和 1700 列的数据框。我想用一个名为“模拟器”的包运行一些模拟。使用这个包,您需要输入数据框的两列的名称(在下面的代码行中,它们是 J,j)然后模拟运行。

sim_par <- hapmap2gamete(geno = geno1[,c(J,j)], map = map, ref = ref, chr2exclude = 22)

我想增加脚本的自动化。我创建了一个包含两列的列表,每列都包含数据框中列的名称。我希望模拟贯穿列表的每一行。我怎么能做到?目前,我仅在使用单列列表对数据框进行子集化然后使用以下代码行之后才设法运行模拟

for (J in 1:(ncol(geno1)-1)){
  for (j in (J+1):ncol(geno1)){

但这意味着我得到了很多我不需要的模拟,我只需要具有两列的列表中的特定模拟。

任何建议将不胜感激。

标签: r

解决方案


如果您有一个较小的示例数据集和预期的输出示例,它会有所帮助,但听起来如果您有一个列名数据框,您可以使用它apply()来将名称集传递到您的函数中。

例如,假设你有一个函数,它只取每一行的总和,这就是你如何将你的函数应用于成对的列名

# Dummy data
df <- data.frame(A = runif(10, min = 0, max = 10), 
                 B = runif(10, min = 0, max = 10), 
                 C = runif(10, min = 0, max = 10), 
                 X = runif(10, min = 10, max = 20), 
                 Y = runif(10, min = -10, max = 0), 
                 Z = runif(10, min = 100, max = 200))
head(df) 

           A        B        C        X          Y        Z
1  1.4750598 8.362330 6.978016 12.21039 -8.5725828 115.7556
2  4.0354462 1.129128 7.344782 11.37921 -6.0101677 157.4816
3  0.4487861 5.458865 1.868728 16.07851 -4.4989306 143.0767
4  6.7159017 9.716656 3.389074 18.60543 -8.8977248 124.7074
5  9.7450640 7.766489 9.853184 10.30856 -5.2577736 138.8847


# Pairs of column names
names <- cbind(J = colnames(df[, 1:3]),
               j = colnames(df[, 4:6]))
names

     J   j  
[1,] "A" "X"
[2,] "B" "Y"
[3,] "C" "Z"


# Custom function
hapmap2gamete <- function(df) {
  rowSums(df)
}

# 1 to apply over rows of data frame of names
results <- apply(names, 1, function(x) hapmap2gamete(df[, c(x)]))


# function results per row
results 


          [,1]       [,2]     [,3]
 [1,] 117.2306 -0.2102531 19.18841
 [2,] 161.5170 -4.8810398 18.72399
 [3,] 143.5255  0.9599347 17.94724
 [4,] 131.4233  0.8189311 21.99450
 [5,] 148.6298  2.5087156 20.16175
 [6,] 143.2299 -0.3145681 20.37046
 [7,] 156.6609 -4.6445246 25.92664
 [8,] 163.0996  4.0362794 19.30689
 [9,] 133.7253  4.4901854 18.26631
[10,] 166.0438  2.2915776 21.57703

推荐阅读