Привет еще раз 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
Что мне здесь не хватает? Очень ценится с вашей помощью!