Как мутировать датафрейм внутри с помощью dplyr

Внутри do Я звоню mutate_ со ссылкой на исходный кадр данных. Проблема в том, что я не могу получить доступ к этому фрейму данных внутри mutate, Это связано с lazyeval пакет, но я не смог понять это. Спасибо за помощь.

Например, скажем, эта функция возвращает data_frame точек.

lattice_points <- function (x0, y0, r){
    df <- expand.grid(
            x1 = ceiling(x0-r):floor(x0+r),
            y1 = ceiling(y0-r):floor(y0+r)) %>% 
        filter((x1-x0)^2 + (y1-y0)^2 <= r^2)
    return (df)
}

Затем я сделал еще одну функцию для сериализации этой (и я хочу идентифицировать ее с id):

many_lattice_points <- function (df, 
        id_ = "id", x_ = "x0", y_ = "y0", r_ = "r") {
    df_out <- rowwise(df_in) %>% 
        do( lattice_points(.[x_], .[y_], .[r_])) %>%
              mutate_(.dots = interp(~ .[var_], var_ = as.name(id_)))
    return (df_out)
}

С этим входом:

> input_df <- data_frame(
    id = c("a", "b"), x0 = c(0.5, 5.5), 
    y0 = c(0.5, 0.5), r  = c(1  , 1  ) )

    id     x0    y0    r
  <chr> <dbl> <dbl> <dbl>
1     a   0.5   0.5     1
2     b   5.5   0.5     1

Я должен получить следующее:

    id     x1    y1 
  <chr> <dbl> <dbl> 
1     a   0.0   0.0 
2     a   0.0   1.0 
3     a   1.0   0.0 
4     a   1.0   1.0 
5     b   5.0   0.0 
6     b   5.0   1.0 
7     b   6.0   0.0 
8     b   6.0   1.0 

Тем не менее, я получаю сообщение об ошибке, потому что не может найти столбец var_,

Пояснение: я нашел другие способы обойти это, но я хотел бы использовать силу do с lazyeval,

1 ответ

Лучший способ добавить id колонка с do это включить его в group_by перед этим.

many_lattice_points <- function (df, 
        id_ = "id", x_ = "x0", y_ = "y0", r_ = "r") {
    df_check <- count_(id_)
    if (not(all(data_check$n == 1))) 
        warning("The function may not work as expected")

    df_out <- group_by_(df_in, .dots = id_) %>% 
        do( lattice_points(.[x_], .[y_], .[r_]) ) 
    return (df_out)
}

Пока еще есть проблема с тем, как это сделать с lazyevalэто удовлетворительно с точки зрения цели и логически.

Другие вопросы по тегам