I have a dataset ,df, as follow :
df = structure(list(filename = c("df1.txt", "df2.txt", "df3.txt",
"df4.txt"), project = c("alpha", "beta", "gamma", "delta"), lat = c(55.1852777777778,
52.6252777777778, 51.446272, 50.688111), long = c(7.15138888888889,
3.96027777777778, 1.078051, -0.343189)), row.names = c(NA, 4L
), class = "data.frame")
I Would like to select 2 filename based on 2 given project :
selected = c("delta", "gamma")
To get the filename I'm using :
fname <- (df[df$project %in% selected,])$filename
But this will return fname as :
fname
[1] "df3.txt" "df4.txt"
Which the order is different by what I passed into the selected object !
I would like to get the fname as :
fname
[1] "df4.txt" "df3.txt"
since df4 is referring to delta and df3 is for gamma !
using dplyr and filter I'm getting the same result.
How could I get the output in the same order as input ?
CodePudding user response:
Use match to get the position index to subset - %in% just returns a logical vector and thus it returns the subset values in the same order or occurrence in the data where there are TRUE values
> with(df, filename[match(selected, project)])
[1] "df4.txt" "df3.txt"
Or using slice in dplyr
library(dplyr)
df %>%
slice(match(selected, project)) %>%
pull(filename)
[1] "df4.txt" "df3.txt"
