Формат даты R изменился после sapply

#r #date #sapply

Вопрос:

 age lt;- c(22,24,NA,27) duedate lt;- as.Date(c("1/1/2020",NA,"1/30/2020","12/31/2021"), format="%m/%d/%Y") df lt;- data.frame(age,duedate)  Minimum lt;- sapply(df, function(x) min(x,na.rm=T)) Maximum lt;- sapply(df, function(x) max(x,na.rm=T)) tbl lt;- data.frame(min_scale,max_Scale) print(tbl) tbl[2,1] lt;- as.Date(tbl[2,1],origin = "1970-01-01") #Do not work   

введите описание изображения здесь введите описание изображения здесь

После создания таблицы даты были изменены на числовые значения, и я не могу вернуть ее обратно. Есть какие-нибудь предложения? Я хочу показать даты, как в правильной таблице. Я хочу сделать это автоматически, насколько это возможно, так как у меня много переменных.

Комментарии:

1. Используйте lapply , а не sapply . У вас не может быть смешанных типов в векторе. Поскольку Возраст не может быть преобразован в дату, и Возраст, и дата даты преобразуются в числовые значения. если вы используете lapply для получения списка, у вас могут быть смешанные типы. Но даже в этом случае вы не можете иметь смешанные типы в столбце data.frame. Если это просто для того, чтобы все выглядело красиво, вам нужно будет преобразовать все в строковое/символьное значение, чтобы сохранить форматирование.

2. Даты в R имеют тип numeric, поэтому, когда атрибуты удаляются в процессе упрощения в массив, даты раскрывают свои базовые значения. Текущий код не имеет смысла, потому что имена min_scale и max_scale, очевидно, должны быть минимальными и максимальными.

Ответ №1:

Это немного проще и приводит к созданию фрейма данных в той же ориентации, df что age и duedate в отдельных столбцах и:

 tbl lt;- as.data.frame(rbind(Minimum, Maximum)) tbl$duedate lt;- as.Date(tbl$duedate, "1970-01-01") tbl # age duedate # Minimum 22 2020-01-01 # Maximum 27 2021-12-31  

Комментарии:

1. Я переставил стол и получил то, что хотел. Спасибо!

Ответ №2:

Решение dplyr с использованием tidyr и. Это будет работать для нескольких столбцов.

 library(dplyr) library(tidyr)  df2 lt;- df %gt;%  summarize(across(.fns = list(Min = min, Max = max), na.rm = TRUE)) %gt;% # Apply min and max function  mutate(across(.fns = as.character)) %gt;% # Convert all columns to character  pivot_longer(everything(), names_to = "Parameter") %gt;% # Convert to long format  separate(Parameter, into = c("Parameter", "Statistics")) %gt;% # Separate the Parameter columns  pivot_wider(names_from = "Statistics", values_from = "value") # Convert to wide format  df2 # # A tibble: 2 x 3 # Parameter Min Max  # lt;chrgt; lt;chrgt; lt;chrgt;  # 1 age 22 27  # 2 duedate 2020-01-01 2021-12-31   

Ответ №3:

Вы можете использовать сводку базовых функций и опустить статс-данные, которые вас не интересуют:

 summary(df)[c(1,6), ] # for numeric values min and max are the 1st and 6th rows. #-------------------------  age duedate   Min. :22.00 Min. :2020-01-01   Max. :27.00 Max. :2021-12-31