dplyr 使用来自单独数据框子集的值进行变异
dplyr mutate using value from a subset of separate data frame
给定以下两个示例数据框:
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
中的 A0dir
值,其中 df2$site == df1$site
在我用 dplyr 变异的行中?
以下无效。
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
大得多,我试图避免完成连接以将 df2
中的 A0dir
和 B0dir
变量引入 df1
.
我们可以在 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
给定以下两个示例数据框:
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
中的 A0dir
值,其中 df2$site == df1$site
在我用 dplyr 变异的行中?
以下无效。
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
大得多,我试图避免完成连接以将 df2
中的 A0dir
和 B0dir
变量引入 df1
.
我们可以在 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