这是我实际数据集的一小部分。
1 2 3 4 5
57.033 57.0332 57.0333 57.0339 57.03332
57.033 57.033 57.0335 59.0490 59.04901
59.0489 59.048 59.0490589 60.0806 60.08
60.0805 60 60.08 60 60.08059
60.08053 60.080 60.08 61.0366 61.03947
相同结构的第二个矩阵。
mz2
1 2 3 4 5
17.26 16.95225 17 17.84 17.79
14 141 143 632 629
630 63 631.337 241.5272 239
539 41 413 412 412
41 240 241 640 56
我需要将col 1中的第一个值与所有列中的所有值进行比较,如果它们符合我的条件,我应该在该特定列的第一行中添加该值。这将在迭代中发生。然后我检查col 1中的第二行并匹配所有列中的所有值,如果它们符合条件,则在特定列的第2行添加它们。
我尝试使用for循环,但这很令人困惑。
这是我的尝试:
x.mz1<-matrix(0,5,5)
b1.mz=mz[,1] ##mz is my sample data above
b2.mz=mz2[,1]
for (i in length(b1.mz))
{
one.mz=b1.mz[i]
one.2=b2.mz[i]
for (j in 2:ncol(mz))
{
two.1=mz[,j]
two=mz2[,j]
for (k in 1:length(two.1))
{
sec.mz=two.1[k]
sec=two[k]
cond1[k]<-one.mz-two.1<0.000005
cond2[k]<-one.2-two<10
cond.check<-cbind(cond1[k],cond2[k])
cond.chc<-rbind(cond.check)
browser()
}
cond.chk.sum<-apply(cond.chc,1,sum)
sum.check<-sum(cond.chk.sum==2,na.rm=T)
if (sum.check==1)
{
x.mz1[i,j]=sec.mz
}
我在代码中尝试的内容:我尝试从所有迭代生成逻辑矩阵,并且在检查了col 2中的所有行之后,将会有一个逻辑矩阵,当生成矩阵时,它将是两种情况下的尺寸均为5x2。然后当两个条件都为TRUE时,如果我正在比较第1列中的第一个值,我将col 2值添加到第1行。
我希望很明显,因为我在来回尝试所有循环结构后感到很困惑。没有使用这么多循环,有没有更简单的方法来做到这一点?使用lappy或其他功能。
输出:不是确切的值,而是让我知道我期望的输出。
1 2 3 4 5
57.03326875 57.03329 0 57.033 57
57.03329688 0 0 0 59.049
59.04894556 60.0805 59.049 60 0
60.0805355 0 0 60.080 60.080
60.08053673 61.039281 0 60.09 61.0839
第一个col是主矩阵中的col 1,并计算所有其他列。如果我找到匹配的所有行中的一个值,那么我将它添加到行和值所属的相应列。 0表示该列中所有行的col 1中此值没有匹配值。
答案 0 :(得分:0)
更新:我第一次尝试时只检查了下一栏。我对起始数据进行了小修改并编辑了循环。见价值1.2。
我不确定我是否完全理解你的要求,但这是一次尝试。
# generate data
v1 <- c(1.2, 5, 9, 13, 17)
v2 <- c(1, 1.3, 10, 14, 18)
v3 <- c(2, 6, 1.4, 15, 1.2)
v4 <- c(3, 7, 11, 1.5, 1.4)
v5 <- c(4, 8, 12, 16, 1.5)
dat <- as.data.frame(cbind(v1, v2, v3, v4, v5))
dat
v1 v2 v3 v4 v5
1 1.2 1.0 2.0 3.0 4.0
2 5.0 1.3 6.0 7.0 8.0
3 9.0 10.0 1.4 11.0 12.0
4 13.0 14.0 15.0 1.5 16.0
5 17.0 18.0 1.2 1.4 1.5
dat2 <- dat
for (r in 1:nrow(dat)) { # loop through rows
for (v in 1:length(dat)) { # loop through columns
v.check <- v + 1
while (v.check < length(dat)) {
if (dat[r,v] %in% dat[,v.check]==TRUE) {
dat2[r,v.check] <- dat[r,v]
v.check <- v
break
} else {
v.check <- v.check + 1
}
}
}
}
dat2
v1 v2 v3 v4 v5
1 1.2 1.0 1.2 3.0 4.0
2 5.0 1.3 6.0 7.0 8.0
3 9.0 10.0 1.4 1.4 12.0
4 13.0 14.0 15.0 1.5 16.0
5 17.0 18.0 1.2 1.4 1.5
答案 1 :(得分:0)
数据。
# data
m1 <- structure(list(X1 = c(57.033, 57.033, 59.0489, 60.0805, 60.08053
), X2 = c(57.0332, 57.033, 59.048, 60, 60.08), X3 = c(57.0333,
57.0335, 59.0490589, 60.08, 60.08), X4 = c(57.0339, 59.049, 60.0806,
60, 61.0366), X5 = c(57.03332, 59.04901, 60.08, 60.08059, 61.03947
)), .Names = c("X1", "X2", "X3", "X4", "X5"), class = "data.frame", row.names = c(NA,
-5L))
m2 <- structure(list(X1 = c(17.26, 14, 630, 539, 41), X2 = c(16.95225,
141, 63, 41, 240), X3 = c(17, 143, 631.337, 413, 241), X4 = c(17.84,
632, 241.5272, 412, 640), X5 = c(17.79, 629, 239, 412, 56)), .Names = c("X1",
"X2", "X3", "X4", "X5"), class = "data.frame", row.names = c(NA,
-5L))
将条件结果作为逻辑对象。
# first columns
m1.c1 <- m1[,1]
m2.c1 <- m2[,1]
# first condition
res1 <- lapply(m1.c1,FUN=function(x){x-m1[,-1] < 0.00005})
# second condition
res2 <- lapply(m2.c1,FUN=function(x){x-m2[,-1] < 10})
# getting final condition as logical
res <- lapply(seq_along(m1.c1), FUN=function(x)(res1[[x]] & res2[[x]]))
到目前为止,如何通过lapply来实现。
现在, res 对象是具有您条件的逻辑答案的列表。如果您的想法描述和提供的数据并不完全一致,那么结果的其他内容并不清楚。