我试图在一个数据框中创建一个新列,该列基于另一个数据框中的“匹配”变量来计算内容。
我知道我可以使用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?
答案 0 :(得分:0)
如果您可以首先将计算所需的所有条件放入需要的行中,则最容易在dplyr
中进行处理。 tidyr::spread
将使y
和(Intercept)
可用于需要的行,并且left_join
可让您附加来自df1
的匹配数据,在这种情况下,基于匹配年份(两个表共享的列)。
library(tidyverse)
df2 %>%
spread(term, estimate) %>%
left_join(df1) %>%
mutate(result = stat * y + `(Intercept)`)