如何使用dplyr

时间:2017-05-18 22:20:13

标签: r dplyr nse lazyeval

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_

澄清: 我找到了其他解决方法,但我想利用dolazyeval的力量。

1 个答案:

答案 0 :(得分:0)

使用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仍然存在问题,但就目的和逻辑而言,这是令人满意的。