2016-12-16 2 views
1

J'ai une trame de données appelé df:comment la carte-vous des valeurs utilisant l'expression rationnelle dans R

dput(df) 
structure(list(Agent = structure(c(3L, 1L, 2L), .Label = c("[email protected]", 
"[email protected]", "[email protected]"), class = "factor"), 
    Server = structure(c(3L, 1L, 2L), .Label = c("domain01", 
    "namesrv200", "proddb101"), class = "factor")), .Names = c("Agent", 
"Server"), class = "data.frame", row.names = c(NA, -3L)) 

Il est un vecteur appelé application qui contient les valeurs:

dput(app) 
c("db", "dm", "ns") 

je dois ajouter une autre column to df appelle l'application et insère les valeurs de l'application qui associe la colonne Agent aux valeurs de l'application. Voici DF1 avec résultat final:

dput(df1) 
structure(list(Agent = structure(c(3L, 1L, 2L), .Label = c("[email protected]", 
"[email protected]", "[email protected]"), class = "factor"), 
    Server = structure(c(3L, 1L, 2L), .Label = c("domain01", 
    "namesrv200", "proddb101"), class = "factor"), App = structure(1:3, .Label = c("db", 
    "dm", "ns"), class = "factor")), .Names = c("Agent", "Server", 
"App"), row.names = c(NA, -3L), class = "data.frame") 

Comment pourrais-je faire cela en R, créer une colonne de valeurs df et insérer dans la colonne correspondant à l'agent avec des valeurs app?

+0

Vous avez pas vraiment précisé comment l'appariement est censé se produire. – joran

+0

@joran, si l'application est dans l'agent df $, ajoutez cette valeur d'application à la ligne correspondante dans df comme une nouvelle entrée – user1471980

+0

Je pense que vos données d'échantillon sont fausses aussi, 'prodb101 @ webserver101' est probablement inversé. –

Répondre

2

Vous pouvez faire

app <- c("db", "dm", "ns") 
names(app) <- c("proddb101", "domain01", "namesrv200") 
df$App <- app[as.character(df$Server)] 
df 
#     Agent  Server App 
# 1 [email protected] proddb101 db 
# 2 [email protected] domain01 dm 
# 3 [email protected] namesrv200 ns 

proddb101 est mis en correspondance db et ainsi de suite. as.character est nécessaire, car df$Server est de type factor.

Ou, si vous voulez faire correspondre de façon plus générale, vous pouvez faire

app <- c("db", "dm", "ns") 
vgrepl <- Vectorize(grepl, "pattern") 
m <- vgrepl(app, df$Agent, fixed = TRUE) 
df$App <- colnames(m)[max.col(m, "first")] # assign first match 
df 
#     Agent  Server App 
# 1 [email protected] proddb101 db 
# 2 [email protected] domain01 dm 
# 3 [email protected] namesrv200 ns 
+0

cela ne fonctionnera pas. Je ne sais pas quel serveur mappe à App. Je dois être capable de chercher une application dans df $ Agent et si match, puis l'ajouter. – user1471980

+0

Jetez un oeil à mon édition. Le titre, l'exemple et la description de votre question sont un peu ambigus. – lukeA

+0

merci ça a marché. – user1471980