使用dplyr中的函数输入重命名列

时间:2017-11-14 22:18:55

标签: r dplyr

我知道在R中重命名列有很多类似的问题,但我还没有找到一种优雅的方法来实现这个简单的任务,这可以很容易地在Python中完成。

这是一个将GIS数据帧转换为空间点的简单功能。但首先我想将坐标列重命名为“lon”和“lat”。有些数据标记为“X”和“Y”,而其他数据可能称为“长”和“纬度”。所以我希望用户指定“lon”和“lat”的列名是什么。我正在使用dplyr。但是,以下将无法正常工作。

library("magrittr")
library("tidyverse")
ToSpatialPoint <- function(data, lon_col="long",lat_col="lati"){
    data %<>% rename(lon=lon_col,lat=lat_col) %<>% distinct(lon,lat) %<>% filter(!is.na(lon),!is.na(lat))
    processed_pts <- SpatialPoints(coords=cbind(lon=data$lon,lat=data$lat), proj4string = CRS("+init=epsg:4326"))
    return(processed_pts)
}

我收到此错误:

Error: `lon_col`, `lat_col` contains unknown variables 

3 个答案:

答案 0 :(得分:2)

最后,由于我很棒的室友分享了一个链接,我想出了答案。 来自tidyverse.org的This document解释了如何使用dplyr进行编程。特别是,如何在dplyr中获取函数输入并对其进行评估。

以下是可行的代码:

ToSpatialPoint <- function(data,lon_col="long",lat_col="lati"){
  lon_col <- enquo(lon_col)
  lat_col <- enquo(lat_col)
  data %<>% rename(lon=!!lon_col,lat=!!lat_col)
  return(data)
}

答案 1 :(得分:1)

以下是一个示例,请注意新名称位于左侧,当前名称位于右侧。您也不需要c()或引用。

require(dplyr) 

mtcars %>% rename(miles_per_gallon=mpg, horsepower=hp)

                  miles_per_gallon cyl disp horsepower drat    wt  qsec vs am
Mazda RX4                     21.0   6  160        110 3.90 2.620 16.46  0  1
Mazda RX4 Wag                 21.0   6  160        110 3.90 2.875 17.02  0  1
Datsun 710                    22.8   4  108         93 3.85 2.320 18.61  1  1
Hornet 4 Drive                21.4   6  258        110 3.08 3.215 19.44  1  0
Hornet Sportabout             18.7   8  360        175 3.15 3.440 17.02  0  0
Valiant                       18.1   6  225        105 2.76 3.460 20.22  1  0

使用您的示例:

data %>% dplyr::rename(lon = lon_col, lat = lat_col)

答案 2 :(得分:0)

接受的答案对我不起作用,但幸运的是,我想起了“按引用分配”运算符,该运算符是:

:=

->

rename(new_variable_name := old_variable_name)

包data.table包含有关in this vignette的良好文档。

在dplyr中,您必须用sym!!包装要传递的变量名(!!的帮助在??rlang::quotation下)。新的重命名功能应如下所示:

data %>%
  rename(!!sym(lon_col) := lon,
         !!sym(lat_col) := lat)