对于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
答案 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