提取两行数据的相等行(在R中)

时间:2014-03-27 11:40:58

标签: r dataframe

我有两个数据框:

a1<-data.frame(a=c(0.5,0.4,0.4,0.2),b=c(0.4,0.3,0.5,0.2))

a2<-data.frame(Check1=c(0.1,0.1,0.1,0.1,0.1,0.2,0.2,0.2,0.2,0.2,0.3,0.3,0.3,0.3,0.3,0.4,0.4,0.4,0.4,0.4,0.5,0.5,0.5,0.5,0.5),Check2=rep(c(0.1,0.2,0.3,0.4,0.5),times=5),Result=letters[1:25])

a1是两个值的观测值的集合,因此不同的行是观察集。我们可以查看数据框a2来读取我们应该在a1中观察到的组合的哪种结果(a2的第三列)。例如,a1中的第一行是(0.5,0.4),我们在a2中看到这给出了结果“x”。

现在,我想在a1中创建一个新列,其中a2中的“result”列的值与我​​们在a1中找到的行匹配。这样,例如,a1.new中的第一行变为: (0.5,0.4, “X”)

输出结果为:

a1.new<-data.frame(a=c(0.5,0.4,0.4,0.2),b=c(0.4,0.3,0.5,0.2),Result=c("x","r","t","g"))

有没有一种有效的方法呢?

2 个答案:

答案 0 :(得分:2)

有点像这样:

newcol<-vector()
for (j in 1:nrow(a2) ) {
   thematch  <- which(a2[,1:2] == a1[j,])
   if (length(thematch)>0 ) newcol<-c(newcol,a2[thematch,3])
   }

然后,假设a1中的每一行都匹配,sa1.new <- cbind(a1,newcol)

我认为那样做。

答案 1 :(得分:1)

您可以匹配列

a1$result <- a2$Result[match(paste0(a1$a,a1$b), paste0(a2$Check1,a2$Check2))]

match返回第一个参数的位置[即。 paste0(a1 $ a,a1 $ b)]在第二个[即。 paste0(A2 $检查1,A2 $ CHECK2)。所以这会产生

(m <- match(paste0(a1$a,a1$b), paste0(a2$Check1,a2$Check2)))
#[1] 24 18 20  7

然后a2Result是使用[的子集。这将在匹配产生的相应位置选择a2 $ Result的值。

a2$Result[m]
#[1] "x" "r" "t" "g"