4

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ループが正しいと仮定します。他のすべてのインデックスをスキップする必要があると思います。したがって、i1、3、5、7、9などから開始する必要があります。変数total_lociはクラスデータフレームです。

4

3 に答える 3

5

可能であれば、ベクトル化されたソリューションを使用するようにしてください。通常、ループよりもメモリ効率が高く、高速です。

この場合、 を使用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)
于 2012-10-12T20:16:20.357 に答える
1

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),])
于 2012-10-12T22:49:38.583 に答える
1

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

mapply次に、 および を使用して、スライスで任意の関数を実行できますdo.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"
于 2012-10-12T20:52:53.127 に答える