Преобразовывать строки в даты только для числовых значений в R - PullRequest
0 голосов
/ 29 января 2019

Предположим, у меня есть вектор значений, смешанный между числовым и строковым значениями, например:

df<-structure(c("Location", "SKU", "Manufacturer", "Size", 
            "State", "43488", "43489", "43490", 
            "43491"), .Names = c("col1","col2","col3","col4","col5","col6","col7","col8","col9"))

Я хотел бы преобразовать только числовые значения (изначально даты Excel) в формат даты Rи оставьте остальные переменные как есть.Вектор, с которым я работаю, - это всего лишь одна строка в большем файле data.frame, поэтому я бы предпочел не разбивать даты по строкам и объединять их позже.До сих пор я пробовал следующее:

as.Date(as.numeric(df), origin = "1899-12-30")
[1] NA           NA           NA           NA           NA           "2019-01-23" "2019-01-24" "2019-01-25" "2019-01-26"

Но это преобразует строки символов в NA.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Попробуйте это:
- создайте функцию, чтобы проверить, можно ли привести значение к типу numeric или нет
- если true, затем преобразовать его в numeric и отформатировать в date
- если false, вернуть значение как

df<-structure(c("Location", "SKU", "Manufacturer", "Size", 
                "State", "43488", "43489", "43490", 
                "43491"), .Names = c("col1","col2","col3","col4","col5","col6","col7","col8","col9"))

convert_num_to_date = function(x){
  if (is.na(as.numeric(x))) {
    return(x)
  } else {
    x = format(as.Date(as.numeric(x), origin = "1899-12-30"))
    return(x)
  }
}

df = sapply(df, convert_num_to_date)
0 голосов
/ 29 января 2019

Мы могли бы узнать индексы, в которых есть числа, и затем преобразовать только эти значения к дате.

inds <- grepl("\\d+", df)
df[inds] <- format(as.Date(as.numeric(df[inds]), origin = "1899-12-30"))

df
#      col1           col2           col3           col4           col5 
#"Location"          "SKU" "Manufacturer"         "Size"        "State"

#      col6           col7           col8           col9 
#"2019-01-23"   "2019-01-24"   "2019-01-25"   "2019-01-26" 

Вариант с ответом выше, используя ifelse без создания дополнительной переменной (inds)

ifelse(grepl("\\d+", df), format(as.Date(as.numeric(df), origin = "1899-12-30")), df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...