#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