Конвертация даты в цикле в R - PullRequest
0 голосов
/ 05 сентября 2018

Привет еще раз stackoverflow. Я снова сталкиваюсь с проблемами в своем коде R при преобразовании столбцов дат, импортированных из Excel, в двойной цикл в R. Следующий код - это то, что я написал для преобразования данных (начиная со столбца 11 до столбца 19 целых данных). набор с длиной столбца 17).

for (m in  11:19) {
  for (i in 1:17) {
    if (is.POSIXct(data_agg[[i,m]])) {
      data_01 <-  as.Date(data_agg[[i,m]])
      data_agg[[i,m]] <- data_01
    }
    else if (grepl("^[[:digit:]]+$",data_agg[[i,m]])) {
      data_02 <-  as.Date(as.numeric(data_agg[[i,m]]),origin="1899-12-30")
      data_agg[[i,m]] <- data_02
    }
  }
}

Существует два типа данных, которые я хочу преобразовать в правильный формат даты. Один из них «POSIXct», а другой - «персонаж». Поскольку они относятся к типу «POSIXct», исходные данные выглядят следующим образом (возьмем 11-й столбец в качестве примера):

data_agg[[11]]
 [1] "2018-03-16 UTC" "2018-03-16 UTC" "2018-03-16 UTC" "2018-03-16 UTC" "2018-03-16 UTC" "2018-03-16 UTC" "2018-03-16 UTC" "2018-03-16 UTC" "2018-03-12 UTC"
[10] "2017-07-20 UTC" "2018-06-07 UTC" "2018-03-15 UTC" "2018-03-06 UTC" "2017-10-19 UTC" NA               NA               NA   

str(data_agg[[11]])
     POSIXct[1:17], format: "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-12" "2017-07-20" "2018-06-07" ... 

Для преобразования в правильный формат я использую as.Date и сохраняю его в фиктивной переменной data_01 и переназначаю исходное значение этой фиктивной переменной.

Для тех, которые имеют «символьный» тип, исходные данные выглядят следующим образом (в качестве примера возьмем 12-й столбец набора данных):

data_agg[[12]]
 [1] "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "Yes"   "Yes"   "N/A"   NA      NA      "43045" NA      NA      NA 

str(data_agg[[12]])
 chr [1:17] "N/A" "N/A" "N/A" "N/A" "N/A" "N/A" "N/A" "N/A" "Yes" "Yes" "N/A" NA NA "43045" NA NA NA

Поскольку меня интересует только число «43045» и преобразование его обратно в формат даты, я использовал

(grepl("^[[:digit:]]+$",data_agg[[i,m]]))

чтобы увидеть, есть ли какое-либо число, содержащееся в строке символов, и, если оно есть, преобразовать его обратно в обычный формат даты, представленный в следующем коде:

else if (grepl("^[[:digit:]]+$",data_agg[[i,m]])) {
      data_02 <-  as.Date(as.numeric(data_agg[[i,m]]),origin="1899-12-30")
      data_agg[[i,m]] <- data_02

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

data_agg[[11]]
 [1] "1970-01-01 04:53:26 UTC" "1970-01-01 04:53:26 UTC" "1970-01-01 04:53:26 UTC" "1970-01-01 04:53:26 UTC" "1970-01-01 04:53:26 UTC" "1970-01-01 04:53:26 UTC"
 [7] "1970-01-01 04:53:26 UTC" "1970-01-01 04:53:26 UTC" "1970-01-01 04:53:22 UTC" "1970-01-01 04:49:27 UTC" "1970-01-01 04:54:49 UTC" "1970-01-01 04:53:25 UTC"
[13] "1970-01-01 04:53:16 UTC" "1970-01-01 04:50:58 UTC" NA                        NA                        NA

Это должно было дать мне результат

"2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-12"
[10] "2017-07-20" "2018-06-07" "2018-03-15" "2018-03-06" "2017-10-19" NA               NA               NA

И 12-й столбец набора данных стал следующим:

data_agg[[12]]
 [1] "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "Yes"   "Yes"   "N/A"   NA      NA      "17476" NA      NA      NA 

Это должно было дать мне результат:

 [1] "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "Yes"   "Yes"   "N/A"   NA      NA      "2017-11-06" NA      NA      NA 

Что мне здесь не хватает? Очень ценится с вашей помощью!

...