Оператор $ для имен переменных объектов - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь использовать оператор $ для выбора и переформатирования определенных столбцов в цикле for для переменных объектов data.frame. Я попробовал 4 различных решения в своем закомментированном коде, но ни одно из них не работает. Я посмотрел так, но я не могу найти другое решение, чтобы попробовать. Как я могу использовать оператор $ для выбора определенных столбцов с именами переменных data.frame?

Спасибо

weather_data_files<-c("CMC","ECMWF","ECMWF_VAR_EPS_MONTHLY_FORECAST",
                          "GFS","ICON_EU","UKMET_EURO4")
for(filename in weather_data_files){

  #create data frame environment objects
  assign(paste(filename),read.csv(file = paste(filename,".csv",sep = ""),sep = ";"))

  #first solution does not work, because filename is here an atomic vector 
  #rather than a data.frame
  #ErrorMessage: $ operator is invalid for atomic vectors
  filename$Forecast.Time<- as.POSIXct(filename$Forecast.Time,
                                      format="%d.%m.%Y %H:%M+%S",tz="UTC")

  #ok get it, let's try second soltution,but
  #it also does not work allthough i try to get the data.frame object
  #ErrorMesssage: could not find function "get<-
  get(filename)$Forecast.Time<-
    as.POSIXct(get(filename)$Forecast.Time,format="%d.%m.%Y %H:%M+%S",tz="UTC")

  #Third solution as.name also does not work
  #ErrorMessage: object of type 'symbol' is not subsettable
  as.name(filename)$Forecast.Time<-
    as.POSIXct(as.name(filename)$Forecast.Time,format="%d.%m.%Y %H:%M+%S",tz="UTC")

  #Fourth solution comparable to second solution, still not working
  #ErrorMessage: could not find function "eval<-"
  eval(assign(filename,get(filename)))$Forecast.Time<-
    as.POSIXct(eval(assign(filename,get(filename)))$Forecast.Time,
                format="%d.%m.%Y %H:%M+%S",tz="UTC")

}

1 Ответ

0 голосов
/ 25 апреля 2018

Итак, проблема в том, что вы передаете строки символов, а не объекты.Функция get извлекает объект, просто нет места для его хранения.

Вы всегда можете загрузить строку символов во временную переменную во время зацикливания.Используйте временную переменную, а затем назначьте ее, когда закончите.

for(filename in c("a","b")){
    tmp <- get(filename)
}

Вы также можете пропустить большую часть цикла for и использовать семейство apply.

files = lapply(paste(c("CMC","ECMWF","ECMWF_VAR_EPS_MONTHLY_FORECAST",
                      "GFS","ICON_EU","UKMET_EURO4"),".csv",sep=""),
       read.csv,sep=";")
files = lapply(files,function(x){x$Forecast.Time = as.POSIXct(x$Forecast.Time,
               format="%d.%m.%Y %H:%M+%S",tz="UTC");return(x)}

Сейчасу вас есть список ваших файлов, с которыми вы можете работать.Вы можете назначить их глобальным переменным, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...