我有两个数据框:
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"))
有没有一种有效的方法呢?
答案 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"