2

我有两个不同长度的数据帧,我想在第一个数据帧中添加一个新列,其中包含第二个数据帧的相应值。

对应的值由以下条件定义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)

不适用于我的真实数据集。

4

1 回答 1

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 秒才能运行。

于 2013-10-10T18:33:30.903 回答