简体   繁体   中英

tidyverse error Error: All select() inputs must resolve to integer column positions

I am having problems implementing my script because of this error:

Error: All select() inputs must resolve to integer column positions.

I found the same error from these links:

1

2

I am calculating the distance between lat-lon points using R. Here's my script:

library(tidyverse)
#functions
dms_to_rad <- function(d, m, s) (d + m / 60 + s / 3600) * pi / 180
great_circle_distance <- function(lat1, long1, lat2, long2) {
  a <- sin(0.5 * (lat2 - lat1))
  b <- sin(0.5 * (long2 - long1))
12742 * asin(sqrt(a * a + cos(lat1) * cos(lat2) * b * b))
}

#read file
dir1 = "JTWC_1979.csv"
dir2 = "Ambulong_proc_1979.csv"
jtwc <- read.csv(dir1) %>%
unite('key',c('Year','Month','Day','Hour'))
stn <- read.csv(dir2) %>%
unite('key',c('Year','Month','Day','Hour'))

#aggregating 
stn <- left_join(jtwc,stn,by = "key") %>%
  drop_na() %>%
  mutate_at(vars(Lat.x,Lon.x,Lat.y,Lon.y),funs(dms_to_rad(.,0,0))) %>%
  mutate(dist = great_circle_distance(Lat.x,Lon.x,Lat.y,Lon.y))

write.csv(stn,file="dist.csv",row.names=T)

File1:

SN  CY  Year    Month   Day Hour    Lat Lon
196101  1   1961    1   14  12  8.3 134.7
196101  1   1961    1   14  18  8.8 133.4
196101  1   1961    1   15  0   9.1 132.5
196101  1   1961    1   15  6   9.3 132.2
196101  1   1961    1   15  12  9.5 132
196101  1   1961    1   15  18  9.9 131.8
196125  1   1961    1   14  12  10.0 136
196125  1   1961    1   14  18  10.5 136.5

file 2:

 Year    Month Day RR Hour Lat  Lon
 1961    1   14  0   0   14.0917 121.055
 1961    1   14  0   6   14.0917 121.055
 1961    1   14  0   12  14.0917 121.055
 1961    1   14  0   18  14.0917 121.055
 1961    1   15  0   0   14.0917 121.055
 1961    1   15  0   6   14.0917 121.055

The "SN" column is a unique identifier in file1. What I want to do:

[1] Calculate the distance(jtwc$dist) when the two files have the same Year,Month,Day, and Hour.

[2] In case a row has the same Year,Month,Day,and Hour but different SN number in file1,I will use the values in the row with the same Year,Month,Day,and Hour in file2 in computing the distance.

Any suggestions on how to do this correctly?

You should have read about ?mutate_at , where you can find a lot of examples how to use it; And your problem is that you are passing the actual columns to .vars while you should use one of the following:

  • one of the dplyr select helper functions see ?select_helpers with vars ;
  • column names as a character vector;
  • column positions as a numeric vector;
  • vars with a sequence colA:colB notation;

For your case you simply need a vector of column names, besides no need to refer to the parent data frame with df$... in mutate , just use the column name:

left_join(jtwc,stn,by = "key") %>%
    drop_na() %>%
    mutate_at(c("Lat.x", "Lon.x", "Lat.y", "Lon.y"), funs(dms_to_rad(., 0, 0))) %>%
    mutate(dist = great_circle_distance(Lat.x, Lon.x, Lat.y, Lon.y))

#      SN CY          key     Lat.x    Lon.x RR     Lat.y    Lon.y     dist
#1 196101  1 1961_1_14_12 0.1448623 2.350959  0 0.2459466 2.112808 1620.961
#2 196101  1 1961_1_14_18 0.1535890 2.328269  0 0.2459466 2.112808 1467.859
#3 196101  1  1961_1_15_0 0.1588250 2.312561  0 0.2459466 2.112808 1364.150
#4 196101  1  1961_1_15_6 0.1623156 2.307325  0 0.2459466 2.112808 1324.915
#5 196125  1 1961_1_14_12 0.1745329 2.373648  0 0.2459466 2.112808 1687.127
#6 196125  1 1961_1_14_18 0.1832596 2.382374  0 0.2459466 2.112808 1724.351

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM