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

3

我知道有很多关于在R中重命名列的类似问题,但我仍然没有找到一种优雅的方法来完成这个简单的任务,而在Python中可以轻松地完成。

这里有一个简单的函数将GIS数据框转换为空间点。但是首先我想将坐标列重命名为“lon”和“lat”。有些数据将它们标记为“X”和“Y”,而其他数据可能称之为“long”和“lat”。因此,我希望用户指定“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 

1
你是说你想找到一种给有两列的数据框命名的方法?而且你找不到简单的方法来实现这个吗? - undefined
1
除非你单独加载magrittr,否则你需要加载dplyr来使用管道。引用命名空间不允许使用管道。另外,在你的示例中调用了一个plyr函数,并在问题中标记了dplyr,你到底想要使用哪个? - undefined
试试使用%>%代替 - undefined
@anotherfred,谢谢你的评论,但是管道不是问题。我编辑了帖子,包括了这个库。 - undefined
@Mako212,我对这两个库都没问题,但是plyrdplyr中的rename函数对我来说都不起作用。我已经添加了plyr标签。 - undefined
显示剩余2条评论
4个回答

8

接受的答案对我没起作用,但幸运的是我记得"赋值引用"操作符,它是:

:=

-->

rename(new_variable_name := old_variable_name)

软件包data.table有很好的文档介绍在这个vignette中

在dplyr中,您必须使用sym!!封装传递的变量名(有关!!的帮助在??rlang::quotation下)。您的新重命名函数应该像这样:

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

所以这需要 library("data.table") 吗?我不确定为什么我的方法对你不起作用,但很高兴你找到了这个解决方案。 - undefined
不,这并不需要使用data.table包。我提供了它的文档链接是因为它非常详细。 - undefined

3

最终,我通过我的室友分享的链接自己找到了答案。来自tidyverse.org的这篇文章解释了如何使用dplyr进行编程,特别是如何将函数输入并在dplyr中进行评估。

以下是可行的代码:

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

0
这是一个例子,注意新名称放在左边,当前名称放在右边。你也不需要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)

0
我认为你需要使用双感叹号(!!)来取消引用一个字符变量。你还需要使用特殊的替代符号(:=)操作符:
new <- "test"
old <- "Sepal.Length"
iris %>% 
  rename(!!new := Sepal.Length) %>% names
[1] "test"         "Sepal.Width"  "Petal.Length" "Petal.Width" 
[5] "Species" 

iris %>% 
  rename(!!new := !!old) %>% names
[1] "test"         "Sepal.Width"  "Petal.Length" "Petal.Width" 
[5] "Species" 

testf <- function(old, new) {
  iris %>% rename(!!new := !!old)
}
testf(old, new) %>% names
[1] "test"         "Sepal.Width"  "Petal.Length" "Petal.Width" 
[5] "Species" 


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接