2015-02-03 10 views
5

ConvertToLocal फ़ंक्शन नीचे Names और Times का डेटा फ्रेम लेता है और कुछ विवरणों के साथ टाइमज़ोन रूपांतरण करता है। मैं इसे कैसे सदिश कर सकता हूं ताकि मैं लूप का उपयोग न करूं?इस लूप को सदिश कैसे करें

धन्यवाद।

यहाँ कोड है:

ConvertToLocal<-function(data) 
{ 
Name<-data$Name 
Time<-data$Time 
    for(i in 1:length(Name)) 
    { 
    if(Name[i]== "Bob" | Name[i] == "Al" ) 
    { 
     Time[i]<-format(Time[i],tz="America/Los_Angeles") 
    }else if (Name[i] == "Mike" | Name[i] == "Tom") 
    { 
     Time[i]<-format(Time[i],tz="Asia/Singapore") 

    }else if (Name[i] == "Fred") 
    { 
     Time[i]<- format(Time[i],tz="Europe/London") 
    } 
    } 
    return(Time) 
} 

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(data) 

उत्तर

2

इस प्रयास करें:

ConvertToLocal<-function(data) { 
    Name<-data$Name 
    Time<-data$Time 

    indx <- Name== "Bob" | Name == "Al" 
    Time[indx]<-format(Time[indx],tz="America/Los_Angeles") 

    indx <- Name == "Mike" | Name == "Tom" 
    Time[indx]<-format(Time[indx],tz="Asia/Singapore") 

    indx <- Name == "Fred" 
    Time[indx]<- format(Time[indx],tz="Europe/London") 

    return(Time) 
} 
1

यहाँ एक और विकल्प, mapply और ifelse का उपयोग कर:

Name <- data$Name 
    Time <- data$Time 
    mapply(function(x,y)format(x,tz=y),Time, 
     ifelse(Name %in% c("Bob","Al" ), 
       "America/Los_Angeles", 
       ifelse(Name %in% c("Mike","Tom" ), 
         "Asia/Singapore", 
         ifelse(Name == "Fred","Europe/London","")))) 
3

आप आसानी से के रूप में 3 परिवर्तनों कर सकते हैं 3 अलग वेक्टर किए गए कदम।

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 
} 

जो देता है उदाहरण डेटा के लिए

> 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 
4

एक और दृष्टिकोण एक लुकअप तालिका बनाने के लिए और फिर

library(data.table) 
DT <- data.table(data) 

TimeZones <-rbindlist(list(
    data.table(Name = c('Bob', 'Al'), tz = 'America/Los_Angeles'), 
    data.table(Name = c('Mike', 'Tom'), tz = 'Asia/Singapore'), 
    data.table(Name = 'Fred', tz = 'Europe/London') 
)) 

setkey(DT, Name) 
setkey(TimeZones, Name) 
final <- TimeZones[DT][, local := mapply(Time, tz = tz, FUN = format)] 
final 

# Name     tz    Time    local 
# 1: Al America/Los_Angeles 2015-02-04 01:27:35 2015-02-03 06:27:35 
# 2: Bob America/Los_Angeles 2015-02-04 01:27:35 2015-02-03 06:27:35 
# 3: Fred  Europe/London 2015-02-04 01:27:35 2015-02-03 14:27:35 
# 4: Mike  Asia/Singapore 2015-02-04 01:27:35 2015-02-03 22:27:35 
विलय में आसानी के लिए mapply

का उपयोग data.table का उपयोग करना होगा

+1

लुकअप टेबल के साथ अच्छा दृष्टिकोण – Rentrop

संबंधित मुद्दे