如何在不使用R中的嵌套循环的情况下引用2个不同的数据帧

时间:2014-08-20 22:03:54

标签: r loops nested-loops

对于x中的每一行,我正在使用num,id1和id2;首先检查y中的每一行,如果x $ num和y $ num相等,并且如果他们从y中对应于x中的id1和id2的列中获取该数字的y值,则将这两行中的min放入y中的列返回x中的新列。

num可以在x中重复,但在y中是唯一的。 id1和id2是x中的值,y中是列标题。

基本上我从x中提取id1和id2,并在与id1和id2同名的列中查看y(给定x和y中行的nums是相同的)。

x <- data.frame(num = c(1,2,2,4), id1 = c("a","b","c","d"), id2 = c("b","d","a","b"));
y <- data.frame(num= c(1,2,3,4,5,6), a = c(1,1,3,2,1,2), b = c(2,3,2,4,5,2), c = c(1,1,3,2,5,2), d = c(3,2,1,3,4,2) );
x$id1 = as.character(x$id1);
x$id2 = as.character(x$id2);

for(i in 1:length(x[,1])){
  for(j in 1:length(y[,1])){
    if(x[i,1] == y[j,1]){
      x$min[i] = min( y[j,x[i,2]], y[j,x[i,3]] )
    }
  }
}

(注意:我在尝试执行该代码时遇到错误。将修复发布的y矩阵并让OP自己解决他的错误。)

我想要实现的输出是将每行x的两个相应列的min加到min列到x。

上面的代码我的工作,但由于我的x和y数据框非常大而且我希望有一些我可以使用的应用方法非常低效,但事实上我只需要参考某些给定x矩阵中的行的y矩阵中的行在我尝试使用apply时解除了我的意思。

Input:
x 
num   id1   id2
1     a     b
2     b     d
2     c     a 
4     d     b

 y
  num a b c d
1   1 1 2 1 3
2   2 1 3 1 2
3   3 3 2 3 1
4   4 2 4 2 3
5   5 1 5 5 4
6   6 2 2 2 2
Output:
x
num   id1   id2   min
1     a     b     1
2     b     d     2
2     c     a     1
4     d     b     3

1 个答案:

答案 0 :(得分:0)

使用match查找相应的列和矩阵方法,以便为&#34; [&#34;会给你一个无循环的解决方案(当OP解决他错误答案的误导性问题时,我会取消删除。)

x$min <- pmin( y[cbind(x$num, match( as.character(x$id2), names(y) ) ) ], 
                 y[cbind(x$num, match( as.character(x$id1), names(y) ) ) ] )
x
#----------------------
  num id1 id2 min
1   1   a   b   1
2   2   b   d   2
3   2   c   a   1
4   4   d   b   3