You can easily do 3 conversions in 3 separate vectorized steps.
Time <- c(as.POSIXct("2015-02-03 14:27:35.943", tz = "UTC"), as.POSIXct("2015-02-03 14:27:35.943", tz = "UTC"), as.POSIXct("2015-02-03 14:27:35.943", tz = "UTC"), as.POSIXct("2015-02-03 14:27:35.943", tz = "UTC")) Name <- c("BOB","Al","Mike","Fred") data <- data.frame(Name = Name, Time = Time) ConvertToLocal <- function(dat) { tzs <- c("America/Los_Angeles", "Asia/Singapore", "Europe/London") groups <- list(c("Bob", "Al"), c("Mike", "Tom"), c("Fred")) for (i in seq_along(groups)) { take <- dat$Name %in% groups[[i]] dat$Time[take] <- format(dat$Time[take], tz = tzs[i], usetz = TRUE) } dat }
which gives, for example, data
> ConvertToLocal(data) Name Time 1 BOB 2015-02-03 08:27:35.943 2 Al 2015-02-03 06:27:35.943 3 Mike 2015-02-03 22:27:35.943 4 Fred 2015-02-03 14:27:35.943
source share