2014 dxdy logo

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

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




 
 Язык R: проверка свойств столбцов таблицы
Сообщение11.04.2020, 00:22 
Аватара пользователя
Задача: выделить в таблице (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 
provincialka в сообщении #1453454 писал(а):
Простая команда apply(dfr, 2, is.numeric) не работает, так как программа считает, что все столбцы в таблице имеют тип character. Другие "is"-ы (например, is.factor) тоже.


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

 
 
 
 Re: Язык R: проверка свойств столбцов таблицы
Сообщение11.04.2020, 14:30 
Аватара пользователя
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 
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 
Аватара пользователя
aitap в сообщении #1453598 писал(а):
apply() делает as.matrix для объектов, которые ей передают;

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

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

 
 
 
 Re: Язык R: проверка свойств столбцов таблицы
Сообщение11.04.2020, 18:41 
provincialka в сообщении #1453602 писал(а):
Менее очевидно, почему sapply() действует наоборот, вернее, то так -- то так.

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

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

 
 
 
 Re: Язык R: проверка свойств столбцов таблицы
Сообщение12.04.2020, 00:42 
Аватара пользователя
А! Вот и разгадка! Хотя все равно странно. То ли он нумерик, то ли не нумерик. Спасибо, буду знать

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group