2017-09-20 6 views
0

Je travaille avec sf objets et j'ai une question sur l'application de fonctions définies par l'utilisateur aux trames de données. C'est un exemple stupide, mais c'est semblable à ce que j'essaye de faire avec un problème plus compliqué. J'ai une trame de données appelée names qui a deux colonnes, chacune avec le nom d'un comté. J'ai également lu dans les données de Caroline du Nord inclus avec le paquet sf.Appliquer à l'aide de caractères

require(sf) 
name_1 <- c('Ashe','Alleghany','Surry') 
name_2 <- c('Currituck','Northampton','Hertford') 
names <- data.frame(cbind(name_1,name_2)) 
nc <- st_read(system.file("shape/nc.shp", package="sf")) 

Ce que je suis en train de faire est de créer une fonction qui descend chaque ligne de mon trame de données names, prend le nom de la colonne de name_1 et le nom de la colonne NAME_2, et voit si elles recouper en utilisant les données géométriques au nc. J'ai:

check_intersection <- function(x){ 
    return(st_intersects(nc[nc$NAME== x$name_1,],nc[nc$NAME==x$name_2,],sparse = FALSE)) 
} 
apply(names,1,check_intersection) 

Mais cela donne une erreur de Error in x$name_1 : $ operator is invalid for atomic vectors. Comment puis-je dire à la fonction pour obtenir les valeurs de caractères sur les colonnes appropriées, pour chaque ligne dans names?

+0

Pourriez-vous ne pas sous-définir votre objet sf par chaque vecteur, puis exécuter un st_intersects ou st_intersection sur les deux objets? Ne pas comprendre pourquoi vous en avez besoin dans le même df – elmuertefurioso

+1

try: 'check_intersection <- function (x) { return (st_intersects (nc [nc $ NAME == x [1],], nc [nc $ NAME == x [ 2],], sparse = FALSE)) } ' – missuse

+0

Vous ne pouvez pas utiliser l'opérateur' $ 'avec des vecteurs. Remplacez x $ name_1 et les autres par quelque chose comme x [, 1] et x $ name_2 avec x [, 2] – csgroen

Répondre

1

Essayez

apply(names, 1, 
    function(x) 
    st_intersects(nc[nc$NAME == x[1],], nc[nc$NAME == x[2],], 
     sparse = FALSE) 
) 

Dans la fonction anonyme, x est un vecteur, pas un data.frame, d'où $ ne fonctionne pas.