2016-03-27 35 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