2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Язык R: проверка свойств столбцов таблицы
Сообщение11.04.2020, 00:22 
Заслуженный участник
Аватара пользователя


18/01/13
12044
Казань
Задача: выделить в таблице (data.frame) столбцы с числовой информацией.
Я, конечно, могу устроить цикл по столбцам и каждый проверить с помощью is.numeric. Но хотелось бы как-то без циклов, векторно.

Простая команда apply(dfr, 2, is.numeric) не работает, так как программа считает, что все столбцы в таблице имеют тип character. Другие "is"-ы (например, is.factor) тоже.

lapply(dfr,mode) почему-то считает все столбцы числовыми (

В то же время, не хотелось бы затевать что-то уж очень вычурное (можно, но так, поглазеть и поудивляться)

Есть у кого-то опыт/идеи?

-- 11.04.2020, 01:07 --

Ура! Получилось!
Хотя
Используется синтаксис C
> sapply(data,mode)
   sirname        age     salary department     gender
 "numeric"  "numeric"  "numeric"  "numeric"  "numeric"
 

тем не менее
Используется синтаксис C
> sapply(data,is.numeric)
   sirname        age     salary department     gender
     FALSE       TRUE       TRUE      FALSE      FALSE

 Профиль  
                  
 
 Re: Язык R: проверка свойств столбцов таблицы
Сообщение11.04.2020, 09:49 


09/05/16
138
provincialka в сообщении #1453454 писал(а):
Простая команда apply(dfr, 2, is.numeric) не работает, так как программа считает, что все столбцы в таблице имеют тип character. Другие "is"-ы (например, is.factor) тоже.


А можно посмотреть на dput(head(dfr)), или это персональные данные? Может быть, при считывании фрейма он из-за каких-то пробелов так и остался в виде строк, хотя строки содержат числа?

 Профиль  
                  
 
 Re: Язык R: проверка свойств столбцов таблицы
Сообщение11.04.2020, 14:30 
Заслуженный участник
Аватара пользователя


18/01/13
12044
Казань
aitap
Нет, не персональные, сгенерированные в качестве учебного примера.
Вот копия экрана:
код: [ скачать ] [ спрятать ]
Используется синтаксис C
> head(data)
    sirname age salary                  department gender
1     Riley  57  16850             Human resources   male
2    Arnold  70  21250             Human resources female
3    Briggs  75  31850      Research & Development female
4  Faulkner  58  17750             Human resources   male
5 Mcfarlane  64  23250       Accounting department female
6      Dunn  19  20250 Information technology (IT)   male
> apply(data,2,mode)
    sirname         age      salary  department      gender
"character" "character" "character" "character" "character"
> apply(data,2,is.numeric)
   sirname        age     salary department     gender
     FALSE      FALSE      FALSE      FALSE      FALSE
> sapply(data,mode)
   sirname        age     salary department     gender
 "numeric"  "numeric"  "numeric"  "numeric"  "numeric"
> sapply(data,is.numeric)
   sirname        age     salary department     gender
     FALSE       TRUE       TRUE      FALSE      FALSE
>
 

Вот такое странное поведение функций!
То, что apply() не может правильно работать с таблицей, я ещё могу понять. Ведь каждый столбец -- это, вообще говоря, тоже data.frame. Но почему sapply() применяет разные функции по-разному?
Впрочем, apply() довольно "умная" функция:
Используется синтаксис C
> mean(data[2])
[1] NA
Предупреждение:
В mean.default(data[2]) :
  аргумент не является числовым или логическим: возвращаю NA
> apply(data[2],2,mean)
     age
44.26531

 Профиль  
                  
 
 Re: Язык R: проверка свойств столбцов таблицы
Сообщение11.04.2020, 17:17 


09/05/16
138
provincialka
Кажется, мне удалось выяснить, в чём тут дело.

apply() делает as.matrix для объектов, которые ей передают; в свою очередь, as.matrix.data.frame возвращает матрицу наиболее общего для всех колонок типа. Например, в data(cars) все колонки являются числами, поэтому mode(as.matrix(cars)) == 'numeric', а в data(DNase) есть колонка-фактор, которую as.matrix вместе с остальной матрицей превращает в строку, поэтому mode(as.matrix(DNase)) == 'character'.

Скорее всего, "numeric" для "строк" в data.frames появляется потому, что строки были превращены в факторы:

Используется синтаксис C
sapply(iris, mode)
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species
#    "numeric"    "numeric"    "numeric"    "numeric"    "numeric"
sapply(iris, is.numeric)
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species
#         TRUE         TRUE         TRUE         TRUE        FALSE
sapply(iris, class)
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species
#    "numeric"    "numeric"    "numeric"    "numeric"     "factor"
 

 Профиль  
                  
 
 Re: Язык R: проверка свойств столбцов таблицы
Сообщение11.04.2020, 17:47 
Заслуженный участник
Аватара пользователя


18/01/13
12044
Казань
aitap в сообщении #1453598 писал(а):
apply() делает as.matrix для объектов, которые ей передают;

Да, это очевидно. Менее очевидно, почему sapply() действует наоборот, вернее, то так -- то так.

Впрочем, глубоко в функции я не лезу: хотя бы простым вещам научить.

 Профиль  
                  
 
 Re: Язык R: проверка свойств столбцов таблицы
Сообщение11.04.2020, 18:41 


09/05/16
138
provincialka в сообщении #1453602 писал(а):
Менее очевидно, почему sapply() действует наоборот, вернее, то так -- то так.

Дело не в sapply(), а в разнице между mode() и is.numeric() для факторов:

Используется синтаксис C
mode(factor())
# [1] "numeric"
is.numeric(factor())
# [1] FALSE
 

 Профиль  
                  
 
 Re: Язык R: проверка свойств столбцов таблицы
Сообщение12.04.2020, 00:42 
Заслуженный участник
Аватара пользователя


18/01/13
12044
Казань
А! Вот и разгадка! Хотя все равно странно. То ли он нумерик, то ли не нумерик. Спасибо, буду знать

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group