使用 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"])
我有一系列 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"])