请求您提供以下问题的帮助。我有两个数据集。
第一个表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
}
}
}
}
任何人都可以建议。
答案 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