Получение согласованных выходных данных при использовании lapply и class в разных фреймах данных

#r

#r

Вопрос:

Я пытаюсь вывести фрейм данных, который определяет типы переменных для данного фрейма данных. Однако я получаю разные результаты в зависимости от фрейма данных. Например:

 lapply(airquality, class) %>% data.frame
  

выдает пригодный для использования фрейм данных с одной строкой, но:

 lapply(diamonds, class) %>% data.frame
  

выдает двухстрочный фрейм данных, в котором требуемая информация находится только во второй строке.

Как я могу получить согласованные результаты между двумя фреймами данных? Я доволен выводом для airquality , но мне бы хотелось только вторую строку diamonds . Я использую только эти два фрейма данных для этого примера, но я хотел бы, чтобы решение было устойчивым и к другим фреймам данных.

Ответ №1:

Столбец может иметь несколько классов. Вы можете свернуть их в одну строку.

 lapply(airquality, function(x) toString(class(x))) %>% data.frame

#    Ozone Solar.R    Wind    Temp   Month     Day
#1 integer integer numeric integer integer integer

lapply(diamonds, function(x) toString(class(x))) %>% data.frame
#    carat             cut           color         clarity   depth   table
#1 numeric ordered, factor ordered, factor ordered, factor numeric numeric
#    price       x       y       z
#1 integer numeric numeric numeric
  

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

1. Спасибо Ronak — один вопрос, однако, при применении вашего решения к алмазам слово ordered по-прежнему появляется рядом с факторами. есть ли в любом случае, чтобы отображался только «фактор»?

2. Это потому, что это упорядоченные факторы, и именно так отображается их класс. Если вы хотите, чтобы они были единственными факторами, вы можете сделать что-то вроде этого sapply(diamonds, function(x) if(is.factor(x)) "factor" else toString(class(x)))

Ответ №2:

Вы можете sapply по столбцам с type_sum :

 sapply(airquality, pillar::type_sum)
# Ozone Solar.R    Wind    Temp   Month     Day 
# "int"   "int"   "dbl"   "int"   "int"   "int" 

sapply(diamonds, pillar::type_sum)
# carat     cut   color clarity   depth   table   price       x       y       z 
# "dbl"   "ord"   "ord"   "ord"   "dbl"   "dbl"   "int"   "dbl"   "dbl"   "dbl" 
  

Обновить
Согласно комментариям OP о желании видеть «фактор», а не «упорядоченный», вы можете выбрать последний элемент класса для каждого типа данных. Для столбцов типа «упорядоченный, фактор» это приведет к извлечению только «фактора»:

 sapply(diamonds, function(x) class(x)[[length(class(x))]])
#  carat       cut     color   clarity     depth     table     price         x         y         z 
# "numeric"  "factor"  "factor"  "factor" "numeric" "numeric" "integer" "numeric" "numeric" "numeric"