R编程:数据匹配,然后选择,然后停止并从下一个位置继续



请求您对以下问题的帮助。我有两个数据集。

第一个表demoa(两列X和Z)

X   Z
1   1
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10  10

第二个数据集demob(Y和W两列)

Y   W
1   2
4   3
7   6
10  9
8   7
2   1
2   1
1   4

现在我想应用这个规则:(x[I]<=y[j])&amp;(z[i]==w[j])。但我的条件是:在第一次(i=1)成功匹配后,循环应该停止并将值打印到文件(y,w)中,然后它应该从x[i=2]和z[i=2]开始。如果没有找到匹配项,循环将自动进入下一次迭代。因此,所需的结果应该如下所示-

Result
Y   W
2   1
4   3
7   6
8   7
10  9

所以我用R写了下面的代码,但面临着一些关于标志位置的问题:

## output tables
demo_a <- data.frame(x = numeric(1000), y = character(1000), stringsAsFactors = FALSE)
demo_b <- data.frame(x = numeric(1000), y = character(1000), stringsAsFactors = FALSE)
## code starts
for(i in seq(from=1, to=nrow(demoa), by=1))
{
    print(i)
    datamatch = 1
    for(j in seq(from=1, to=nrow(demob), by=1))
    {
        print(i)
        while(datamatch == 1)
        {
            if((demoa$x[i] <= demob$y[j]) && (demoa$z[i] == demob$w[j]))
            {
                print(demoa$x[i])
                print(demob$y[j])
                print(demoa$z[i])
                print(demob$w[j])
                demo_a$x[i] <- demoa[i,1]
                demo_a$y[i] <- demoa[i,2]
                demo_b$x[j] <- demob[j,1]
                demo_b$y[j] <- demob[j,2]
                datamatch = 0
            }
            else
            {
                datamatch = 1
            }
        }
    }
}

有人能提出建议吗。

我会试试:

res<-outer(x,y,`<=`) & outer(z,w,`==`)
cbind(y,w)[setdiff(max.col(res,"first")*NA^!rowSums(res),NA),]
#      y w
#[1,]  2 1
#[2,]  4 3
#[3,]  7 6
#[4,]  8 7
#[5,] 10 9

如果你想看到所有的值,你可以尝试:

cbind(cbind(x,z)[which(rowSums(res)!=0),],
      cbind(y,w)[setdiff(max.col(res,"first")*NA^!rowSums(res),NA),])
#     x z  y w
#[1,] 1 1  2 1
#[2,] 3 3  4 3
#[3,] 6 6  7 6
#[4,] 7 7  8 7
#[5,] 9 9 10 9

数据

x<-1:10
y<-c(1, 4, 7, 10, 8, 2, 2, 1)
w<-c(2, 3, 6, 9, 7, 1, 1, 4)
z<-1:10

相关内容

最新更新