【问题标题】:How to loop through an array in pairs?如何成对循环遍历数组?
【发布时间】:2012-10-12 20:12:54
【问题描述】:

我有一个 1000x1 向量(1000 行和 1 列)。我想成对获取元素(第 1 行和第 2 行、第 3 行和第 4 行、第 5 行和第 6 行等)

这是我目前所拥有的

for (j in 1: ncol(total_loci)){
    for (i in 1: sample_size){
    # a pair
    genotype[i]<- paste(total_loci[i, j], total_loci[i+1,j], sep="")
    }
}

因此,基因型应该是包含基因型的 500x1 向量(500 行和 1 列)。假设我的 for 循环是正确的。我认为我需要跳过所有其他索引 - 所以我的 i 应该从 1 开始,然后是 3、5、7、9 等。变量 total_loci 属于类数据框。

【问题讨论】:

  • 使用rep(seq())生成分组,重塑宽和mapply?

标签: arrays r matrix dataframe


【解决方案1】:

您应该尽可能使用矢量化解决方案。它们通常比循环更节省内存和更快。

在这种情况下,您可以使用seq 为每个其他元素生成一个索引向量。然后,您可以使用该索引向量成对地对原始向量进行子集化。

# sample data
x <- replicate(5, sample(LETTERS, 1000, replace=TRUE), simplify=FALSE)
x <- as.data.frame(x, stringsAsFactors=FALSE)
names(x) <- paste("V",1:NCOL(x), sep="")

# function to concatenate every other observation as a pair
f <- function(x) {
  s <- seq(2, length(x), 2)
  paste(x[s-1], x[s], sep="")
}

# run algorithm for each column
y <- as.data.frame(lapply(x, f), stringsAsFactors=FALSE)

【讨论】:

  • 你能告诉我类似的情况是什么吗?即它如何将这些更改应用于我的脚本?
  • 我使用了双 for 循环,因为我有一个更大的矩阵——我认为是 1000 x n(1000 行乘 n 列)。我想一次遍历每一行一列。我应该改用 seq 吗?
  • @user1313954:你试过我的代码了吗?我的示例数据有 1000 行和 5 列,我的代码创建了一个包含 500 行和 5 列的结果。
  • 我很惊讶没有看到rollapply 解决方案。 :)
  • @RomanLuštrik 不需要循环;只需创建两个新向量。
【解决方案2】:

这是处理n 元素的连续块中的数组的一般方法。可以设置n = 2成对处理。

首先,这是一个将向量 n×n 分割的函数,返回 n 元素的列表:

n.ny.n <- function(x, n) split(x, 1+(seq_along(x)-1) %% n)

n.by.n(x = 1:24, n = 2)
# $`1`
#  [1]  1  3  5  7  9 11 13 15 17 19 21 23
# 
# $`2`
#  [1]  2  4  6  8 10 12 14 16 18 20 22 24

然后您可以使用mapplydo.call 在切片上运行任何函数:

do.call(mapply, c(FUN = paste, n.by.n(x = 1:24, n = 2), sep = "_"))
#  [1] "1_2"   "3_4"   "5_6"   "7_8"   "9_10"  "11_12" "13_14" "15_16"
#  [9] "17_18" "19_20" "21_22" "23_24"

do.call(mapply, c(FUN = paste, n.by.n(x = 1:24, n = 6), sep = "_"))
# [1] "1_2_3_4_5_6"       "7_8_9_10_11_12"    "13_14_15_16_17_18"
# [4] "19_20_21_22_23_24"

【讨论】:

    【解决方案3】:

    这是一种无需任何apply 家庭电话或循环的方法:

    # Generate some sample data.
    total_loci<-data.frame(genotype=sample(LETTERS,500,replace=TRUE))
    # Paste
    paste0(total_loci[c(TRUE,TRUE,FALSE,FALSE),],
           total_loci[c(FALSE,FALSE,TRUE,TRUE),])
    

    【讨论】:

      猜你喜欢
      • 2021-08-27
      • 2023-03-07
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多