2013-07-11 47 views
1

我有两个不同长度的数据帧,我想用第二个数据框的相应值向第一个数据框添加一个新列。如何根据多个条件将数据列添加到另一个数据框的值

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

不会为我的真实数据集工作。

+5

'merge(DF1,DF2)'??? – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto对于这个样本数据集非常适用,但缺乏灵活性以便具有更复杂的逻辑,而不是简单地将所有列匹配为 – ds440

回答

1

DF1$Z <- sapply(1:nrow(DF1), function(i) DF2$Z[DF2$X==DF1$X[i] & DF2$Y==DF1$Y[i]])似乎占用for循环的大约四分之一时间。

我创建了DF1,每个代表有300个代码,我的函数花费了大约2秒的时间;你的循环与子集运行约8秒,并重新打包你的循环到一个sapply它需要约5秒运行。

+0

抱歉之前不接受答案,只是看到现在的问题有一个答案 – Latrunculia

相关问题