我知道在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
答案 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)