我有一个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
是类数据框。
答案 0 :(得分: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)
答案 1 :(得分:1)
以下是在n
元素的连续块中处理数组的一般方法。您可以将n = 2
设置为成对处理。
首先,这是一个将n-by-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"
答案 2 :(得分: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),])