您如何在mutate_at()中使用rox()? [英] How do you use approx() inside of mutate_at()?

查看:58
本文介绍了您如何在mutate_at()中使用rox()?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在让rox()在mutate_at()内部工作时遇到了问题.我确实使用一个很长的mutate()函数来获取想要的东西,但是为了将来参考,我想知道是否有一种更优雅,更少粘贴粘贴的mutate_at()方式来实现.

I'm having issues getting approx() to work inside of a mutate_at(). I did manage to get what I want using a very long mutate() function, but for future reference I was wondering if there was a more graceful and less copy-pasting mutate_at() way to do this.

总体问题是将数据集从1年间隔的数据合并到3年间隔的数据,并以3年间隔对没有数据的年份进行插值.在几年之间,以及一年之间需要某种形式的推断的缺失值.

The overarching problem is merging a dataset with data from 1 year intervals to one with 3 year intervals, and interpolating years with no data in the dataset with 3 year intervals. There are missing values in between the years, and one year that requires some form of extrapolation.

library("tidyverse")

demodf <- data.frame(groupvar = letters[rep(1:15, each = 6)],
                     timevar = c(2000, 2003, 2006, 2009, 2012, 2015),
                     x1 = runif(n = 90, min = 0, max = 3),
                     x2 = runif(n = 90, min = -1, max = 4),
                     x3 = runif(n = 90, min = 1, max = 12),
                     x4 = runif(n = 90, min = 0, max = 30),
                     x5 = runif(n = 90, min = -2, max = 5),
                     x6 = runif(n = 90, min = 20, max = 50),
                     x7 = runif(n = 90, min = 1, max = 37),
                     x8 = runif(n = 90, min = 0.3, max = 0.5))

demotbl <- tbl_df(demodf)

masterdf <- data.frame(groupvar = letters[rep(1:15, each = 17)],
                      timevar = 2000:2016,
                      z1 = runif(n = 255, min = 0, max = 1E6))

mastertbl <- tbl_df(masterdf)

joineddemotbls <- mastertbl %>% left_join(demotbl, by = c("groupvar", "timevar"))

View(joineddemotbls)

joineddemotblswithinterpolation <- joineddemotbls %>% group_by(groupvar) %>%
  mutate(x1i = approx(timevar, x1, timevar, rule = 2, f = 0, ties = mean, method = "linear")[["y"]],
         x2i = approx(timevar, x2, timevar, rule = 2, f = 0, ties = mean, method = "linear")[["y"]],
         x3i = approx(timevar, x3, timevar, rule = 2, f = 0, ties = mean, method = "linear")[["y"]],
         x4i = approx(timevar, x4, timevar, rule = 2, f = 0, ties = mean, method = "linear")[["y"]],
         x5i = approx(timevar, x5, timevar, rule = 2, f = 0, ties = mean, method = "linear")[["y"]],
         x6i = approx(timevar, x6, timevar, rule = 2, f = 0, ties = mean, method = "linear")[["y"]],
         x7i = approx(timevar, x7, timevar, rule = 2, f = 0, ties = mean, method = "linear")[["y"]],
         x8i = approx(timevar, x8, timevar, rule = 2, f = 0, ties = mean, method = "linear")[["y"]])

View(joineddemotblswithinterpolation)

# this is what I want

效果很好.但是我已经尝试了所有这些mutate_at()变体,但还没有使它们起作用.我确定某个地方的语法有误...

That works pretty well. But I've tried all these mutate_at() variants and have not gotten them to work. I am sure there is an error in the syntax somewhere...

joineddemotblswithinterpolation2 <- joineddemotblswithinterpolation %>% group_by(groupvar) %>%
  mutate_at(vars(x1, x2, x3, x4, x5, x6, x7, x8), approx(timevar, ., timevar, rule = 2, f = 0, ties = mean, method = "linear")[["y"]])

# error

joineddemotblswithinterpolation2 <- joineddemotblswithinterpolation %>% group_by(groupvar) %>%
  mutate_at(vars(x1, x2, x3, x4, x5, x6, x7, x8), approxfun(timevar, ., timevar, rule = 2, f = 0, ties = mean, method = "linear")[["y"]])

# error

joineddemotblswithinterpolation2 <- joineddemotblswithinterpolation %>% group_by(groupvar) %>%
  mutate_at(vars(x1, x2, x3, x4, x5, x6, x7, x8), funs(approxfun(timevar, ., timevar, rule = 2, f = 0, ties = mean, method = "linear")[["y"]]))

# error

joineddemotblswithinterpolation2 <- joineddemotblswithinterpolation %>% group_by(groupvar) %>%
  mutate_at(vars(x1, x2, x3, x4, x5, x6, x7, x8), funs(approxfun(timevar, ., rule = 2, f = 0, ties = mean, method = "linear")[["y"]]))

我什至尝试了na.approx(),但也无济于事...

I even tried na.approx(), but also to no avail...

library("zoo")
joineddemotblswithinterpolation2 <- joineddemotblswithinterpolation %>% group_by(groupvar) %>%
  mutate_at(vars(x1, x2, x3, x4, x5, x6, x7, x8), na.approx(., timevar, na.rm = FALSE))

我已经从以下相关问题构建了这些不同的试验:

I've kind of constructed these different trials from the following related questions:

在dplyr中使用大约

使用dplyr进行线性插值

将rox()与dplyr中的组配合使用

使用dplyr但跳过组的线性插值缺少所有值

R:按组对NA进行插值

感谢您的帮助!

推荐答案

您非常亲密.这对我有用:

You're very close. This works for me:

joineddemotblswithinterpolation <- joineddemotbls %>%
  group_by(groupvar) %>%
  mutate_at(vars(starts_with("x")), # easier than listing each column separately
            funs("i" = approx(timevar, ., timevar, rule = 2, f = 0, ties = mean,
                              method = "linear")[["y"]]))

这将创建带有插值的列 x1_i x2_i 等.

This will create columns x1_i, x2_i etc. with the interpolated values.

这篇关于您如何在mutate_at()中使用rox()?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆