我有两个不同长度的数据帧,我想在第一个数据帧中添加一个新列,并使用第二个数据帧的相应值。
相应的值由以下条件if (DF1[i,1] == DF2[,1] & DF1[i,2] == DF2[i,2]) == TRUE
定义,然后该行的值应从DF2获取并写入DF1$newColumn[i]
。
以下数据框用于说明问题:
DF1<-data.frame(X = rep(c("A","B","C"),each=3),
Y = rep(c("a","b","c"),each=3))
DF2<-data.frame(X = c("A","B","C"),
Y = c("a","b","c"),
Z = c(1:3))
我尝试使用上面文本中的if()
语句,但条件返回一个TRUE / FALSE的向量,但似乎不起作用。
我现在使用的代码是
for (i in 1 : length(DF1[,1])) {
DF1$Z[i] <- subset(DF2,DF2$X == DF1$X[i] & DF2$Y == DF1$Y[i])$Z
}
然而,它非常慢(用户系统已经过了115.498 12.341 127.799,我的完整数据帧)并且必须有一种更有效的方法来编码。另外,我反复阅读过,矢量化比循环更有效,但我不知道该怎么做。
我确实需要使用条件语句,例如
DF1$Zz<-rep(DF2$Z,each=3)
不适用于我的真实数据集。
答案 0 :(得分:2)
DF1$Z <- sapply(1:nrow(DF1), function(i) DF2$Z[DF2$X==DF1$X[i] & DF2$Y==DF1$Y[i]])
似乎花费了大约四分之一的for循环时间。
我用每个代表创建了300个DF1,我的函数需要大约2秒来运行;你的子集循环需要大约8秒运行,并将你的循环重新打包成一个sapply需要〜5秒才能运行。