引用和索引dplyr mutate工作流程中的其他数据框

时间:2019-06-01 17:18:51

标签: r dplyr

我试图在一个数据框中创建一个新列,该列基于另一个数据框中的“匹配”变量来计算内容。

我知道我可以使用apply来做到这一点,但这是我还没有弄清楚如何在dplyr中执行的唯一工作流,我想找到一个整洁的解决方案。

我创建了一个数据框df1,其中包含组(随机动物),年份和一些统计信息。我想更改此数据框中的新列,该列使用该统计信息和一组线性模型(df2的输出数据框来计算内容。

# generate reprex df1 
year <- seq(1990, 2010, 1)
group <- c("giraffe","rhino","flamingo","shark","turtle")
df1 <- expand.grid(year, group) %>% 
  rename(year = Var1,
         group = Var2) %>% 
  mutate(stat = runif(length(year),37,44))

# generate reprex df2 
term <- c("(Intercept)","y")
df2 <- expand.grid(year, term) %>% 
  rename(year = Var1,
         term = Var2) %>% 
  mutate(estimate = ifelse(term=="y", -runif(n(), 1.1, 1.3), runif(n(), 50, 60)))

我想将stat的{​​{1}}列输入到df1提供的方程式每年中,使用行的方程式({{1 }}。请注意,df2中的截距和斜率每年都会变化。从概念上讲,这看起来像 y=ax+b

例如,对于1993年的长颈鹿,这将是39.58 *(-1.23)+ 50.14 = 1.45(为了便于阅读,保留了一些小数位)。

我该如何实际使用dplyr?

1 个答案:

答案 0 :(得分:0)

如果您可以首先将计算所需的所有条件放入需要的行中,则最容易在dplyr中进行处理。 tidyr::spread将使y(Intercept)可用于需要的行,并且left_join可让您附加来自df1的匹配数据,在这种情况下,基于匹配年份(两个表共享的列)。

library(tidyverse)
df2 %>%
  spread(term, estimate) %>%
  left_join(df1) %>%
  mutate(result = stat * y + `(Intercept)`)