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

时间:2016-05-18 10:18:08

标签: r loops

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

第一个表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])&& (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
            }
        }

    }
}

任何人都可以建议。

1 个答案:

答案 0 :(得分:2)

我试试:

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