Как мутировать датафрейм внутри с помощью 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
это удовлетворительно с точки зрения цели и логически.