首页 文章

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

提问于
浏览
1

对于x中的每一行,我都使用num,id1和id2;如果x $ num和y $ num相等,则首先检查y中的每一行,如果他们从y中与id1和id2中的id相对应的那一列中获取该y的y值,则将这两个中的min放入y中的列返回x中的新列 .

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

所以基本上我从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

    使用 match 查找相应的列和矩阵方法以使用"["的双列索引将为您提供无循环解决方案(当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
    

相关问题