2016-03-27 15 views
0

的子集的值给定以下两个示例数据帧:dplyr变异使用从单独的数据帧

set.seed(2299) 
df1 <- data.frame(site = c("site1","site1","site1","site2","site2","site2"), 
        A0 = rnorm(6),B0 = rnorm(6)) 
df2 <- data.frame(site = c("site1", "site2"), 
        A0dir = c(220, 110), B0dir = c(310,200)) 

我怎样才能其中行中的df2$site == df1$site我正在与dplyr突变使用A0dir值从df2

以下不起作用。

df1 %>% 
     mutate(disp = df2$A0dir[site == df2$site] + A0/B0) 

下得到了"site1"正确的答案,但我需要它的所有网站的工作。

df1 %>% 
     mutate(disp = df2$A0dir["site1" == df2$site] + A0/B0) 

以下两个产生Error: not compatible with STRSXP

df1 %>% 
     mutate(disp = subset(df2, site == .$site, select = A0dir))  

df1 %>% 
     mutate(disp = subset(df2, site == "site1", select = A0dir)) 

在现实中,df1大得多,我试图避免在完成加入带来的A0dirB0dir变量从df2df1

+0

或者'DF1%>%left_join(DF2)%>%变异(DISP = A0dir + A0/B0)' –

回答

1

我们可以在mutate()内使用match()

df1 %>% mutate(disp = df2$A0dir[match(site, df2$site)] + A0/B0) 
# site   A0   B0  disp 
#1 site1 -1.5784780 0.1712790 210.7842 
#2 site1 1.0957047 0.6394951 221.7134 
#3 site1 -1.3443118 0.1814845 212.5927 
#4 site2 1.0674512 0.7809774 111.3668 
#5 site2 1.3821173 1.7001376 110.8129 
#6 site2 -0.1283199 -0.7093244 110.1809 
+0

工作太棒了!谢谢mtoto。也可以使用'paste()'进行多个匹配。 – Clay