对于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 回答
使用
match
查找相应的列和矩阵方法以使用"["的双列索引将为您提供无循环解决方案(当OP修复其错误答案的误导性问题时,我将取消删除 . )