在dqr中使用函数输入来检查列

9gm1akwq  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(80)

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

mwkjh3gx

mwkjh3gx1#

接受的答案对我不起作用,但幸运的是我记得“通过引用赋值”操作符,即:
第一个月
-->
rename(new_variable_name := old_variable_name)
包data.table有关于它的很好的文档in this vignette
在dqr中,你必须用sym!! Package 你传递的变量名(关于!!的帮助在??rlang::quotation下)。你的新重命名函数应该看起来像这样:

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

字符串

thtygnil

thtygnil2#

最后,我自己找到了答案,这要归功于我的室友分享的一个链接。This document来自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)
}

字符串

nwlls2ji

nwlls2ji3#

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

apeeds0o

apeeds0o4#

我认为你需要bang-bang(!!)来取消字符变量的引号。你还需要使用一个特殊的替代:=运算符:

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"

字符串

相关问题