使用 for 循环执行 15 步并将向量与数据帧列匹配

Use for loop to take steps of 15 and match vector to dataframe column

我有一系列 0 或 1 的数字。总长度为 35115,或者如果您采用 35115/15,则有 2341 个块。我想遍历每个块,看看我的向量 tmp 是否与包含这些块的感兴趣的列匹配。我想沿着我的数据框进行排序,但采取 15 步并询问这 15 步是否与我的向量匹配。 我究竟做错了什么?有人能帮我吗?谢谢大家教我一些有用的东西。干杯

x;
        V1       V2 V3 V4  V5 V6 V7
 3R 11024348  A  G  A1  0 61
 3R 11024348  A  G  A2  1 30
 3R 11024348  A  G  A3  0 68
 3R 11024348  A  G  A4  0 57
 3R 11024348  A  G  A5  0 63
 3R 11024348  A  G  A6  0 49
 3R 11024348  A  G  A7  0 60
 3R 11024348  A  G  B1  0 63
 3R 11024348  A  G  B2  0 64
 3R 11024348  A  G  B3  0 71
 3R 11024348  A  G  B4  1 51
 3R 11024348  A  G  B5  0 37
 3R 11024348  A  G  B6  0 52
 3R 11024348  A  G  B7  0 47
 3R 11024348  A  G AB8  0 83
 3R 11024410  C  T  A1  0 45
 3R 11024410  C  T  A2  1 54
 3R 11024410  C  T  A3  0 76
 3R 11024410  C  T  A4  0 48
 3R 11024410  C  T  A5  0 49
 3R 11024410  C  T  A6  1 48
 3R 11024410  C  T  A7  0 45
 3R 11024410  C  T  B1  0 48
 3R 11024410  C  T  B2  0 81
 3R 11024410  C  T  B3  1 58
 3R 11024410  C  T  B4  1 50
 3R 11024410  C  T  B5  0 65
 3R 11024410  C  T  B6  1 45
 3R 11024410  C  T  B7  0 66
 3R 11024410  C  T AB8  0 58


tmp<-c(1,1,0,1,1,1,1,1,1,1,1,1,0,0,0)
for(i in seq(from=1, to=length(X$V6), by=15)){print(matchID<-match(tmp,X$V6[i]))}

我不完全确定预期的输出,但也许是这样:

首先复现数据:

x <- read.table(text = "        V1       V2 V3 V4  V5 V6 V7
 3R 11024348  A  G  A1  0 61
                3R 11024348  A  G  A2  1 30
                3R 11024348  A  G  A3  0 68
                3R 11024348  A  G  A4  0 57
                3R 11024348  A  G  A5  0 63
                3R 11024348  A  G  A6  0 49
                3R 11024348  A  G  A7  0 60
                3R 11024348  A  G  B1  0 63
                3R 11024348  A  G  B2  0 64
                3R 11024348  A  G  B3  0 71
                3R 11024348  A  G  B4  1 51
                3R 11024348  A  G  B5  0 37
                3R 11024348  A  G  B6  0 52
                3R 11024348  A  G  B7  0 47
                3R 11024348  A  G AB8  0 83
                3R 11024410  C  T  A1  0 45
                3R 11024410  C  T  A2  1 54
                3R 11024410  C  T  A3  0 76
                3R 11024410  C  T  A4  0 48
                3R 11024410  C  T  A5  0 49
                3R 11024410  C  T  A6  1 48
                3R 11024410  C  T  A7  0 45
                3R 11024410  C  T  B1  0 48
                3R 11024410  C  T  B2  0 81
                3R 11024410  C  T  B3  1 58
                3R 11024410  C  T  B4  1 50
                3R 11024410  C  T  B5  0 65
                3R 11024410  C  T  B6  1 45
                3R 11024410  C  T  B7  0 66
                3R 11024410  C  T AB8  0 58", header = TRUE)

tmp<-c(1,1,0,1,1,1,1,1,1,1,1,1,0,0,0)

现在使用整数除法来定义块,然后使用 aggregate 或您选择的 "split-apply-combine" 函数:

aggregate(x$V6, list(block = (seq_len(nrow(x)) - 1) %/% 15), FUN = function(v) all(v == tmp))
#  block     x
#1     0 FALSE
#2     1 FALSE

一个可能更快的替代方法是将 data.frame 的列转换为矩阵并执行此操作:

colSums(matrix(x$V6, nrow = 15) == tmp) == 15L
#[1] FALSE FALSE

如果你真的想使用for loop,你需要定义一个数据结构来存储你的循环结果(可以是数字、字符串、列表、矩阵等的向量)。

类似于 matchID<-vector()

让我们看看您的代码:

for(i in seq(from=1, to=length(X$V6), by=15)){print(matchID<-match(tmp,X$V6[i]))}

你的 for 函数调用了一个循环,从 1 到 30(V6 的长度)跳转了 15(tmp 的长度),所以它会 return:

>for(i in seq(1,30,15)) print(i)
[1] 1
[1] 16

所以如果你用 i 索引你的 V6 向量,循环将只 return 1 和 16 处的值。

这是我的解决方案:

matchID<-vector() # stores the loop return in a vector
for(i in 1:length(x[, "V6"]){  
  matchID[i]<- as.numeric(tmp == x[, "V6"])[i]
}

你可以看到,对于 matchID 中的第 i 个元素,它总是等于比较 temp 和 vector 中的第 i 个元素"V6".

但是,在这种情况下你真的不需要循环

matchID<-as.numeric(tmp == x[, "V6"])