Я использую следующую стратегию, чтобы сделать выбор переменных в R. эффективным.
Использование метаданных для хранения имен переменных
У меня есть фреймы данных с одной строкой на переменную для определенных наборов переменных.Например, у меня может быть личностный тест из 100 предметов.Метаданные включают имя переменной в R вместе со всей оценочной информацией (например, должен ли элемент быть изменен и т. Д.).Затем я могу извлечь имена переменных для элементов и имена шкал из этих метаданных.
Сохранение наборов переменных в именованном списке
В каждом проекте у меня есть список с именем v
, в котором хранятся именованные наборы переменных.Тогда в любом анализе, который требует набора переменных, я могу просто обратиться к именованному списку.Это также делает код более надежным, потому что, если имена переменных меняются, то и все ваши условные анализы.Это также хорошо для создания согласованности в порядке упорядочения переменных.
Вот простой пример:
v <- list()
v$neo_items <- meta.neo$id
v$ds14_items <- meta.ds14$id
v$core_items <- c(v$neo_items, v$ds14_items)
v$typed_scales <- c("na", "si")
v$typed_all <- c("typed_continuous_sum", "na", "si")
v$neo_facets <- sort(unique(meta.neo$facet))
v$neo_factors <- c("agreeableness", "conscientiousness",
"extraversion", "neuroticism", "openness")
v$outcomes_scales <- c("healthbehavior", "socialsupport",
"physical_symptoms", "psychological_symptoms")
Несколько моментов можно увидеть из приведенного выше примера:
- Часто списки переменных создаются из метаданных, которые я хранил отдельно.Так, например, у меня есть имена переменных для 240 itms neo-теста личности, хранящиеся в
meta.neo$id
- В некоторых случаях имена переменных могут быть получены из метаданных.Например, один из столбцов в моих метаданных для теста личности указывает, к какому масштабу относится элемент, а имена переменных выводятся из этого столбца, принимая значение
unique
этого столбца. - В некоторых случаях наборы переменных являются комбинацией меньших наборов.Так, например, у вас может быть один набор для предикторов, один набор для результатов и один набор, который объединяет предикторы и результаты.Разделение на предикторы и результаты может быть полезно для некоторых регрессионных моделей, а комбинированный набор может быть полезен для матрицы корреляции или факторного анализа.
- Для более специальных списков переменных я все еще использую
dput(names(df)
где df
- мой data.frame для генерации вектора имен символов, который затем сохраняется в списке переменных. - Эти списки переменных обычно размещаются после загрузки ваших данных, но до их обработки.Таким образом, их можно использовать для подготовки данных, и они, безусловно, доступны, когда вы начинаете анализ (например, прогностические модели, корреляции, описательная статистика и т. Д.).
- Красота списков переменных заключается в том, что выможет легко использовать auto-copmlete в RStudio.Поэтому вам не нужно запоминать имена переменных или даже имена списков переменных.Вы просто набираете
v$
и нажимаете tab или v$
и некоторую часть имени списка.
Использование списков переменных
Использование списков переменных довольно просто, но некоторые функциив R указывать имена переменных по-разному.
Простой и стандартный сценарий предполагает предоставление списка имен переменных в подмножество data.frame.Например,
cor(data[,v$mylist])
cor(data[,v$predictors], data[,v$outcomes])
Это немного сложнее для функций, которые требуют формул.Вам может понадобиться написать функцию.Например:
v <- list()
v$predictors <- c("cyl", "disp")
f <- as.formula(paste("mpg ~", paste(v$predictors, collapse = " + ")))
lm(f, mtcars)
Вы также можете использовать списки переменных в таких функциях, как sapply
и lapply
(и, вероятно, в эквивалентных значениях).Например,
Создать таблицу описательной статистики с помощью:
sapply(mydata[, v$outcomes], function(X) c(mean = mean(X), sd = sd(X)))
dput
все еще полезно
Для специальных переменных или даже когда вы просто пишете коддля создания списка переменных очень полезно использовать dput
.
Стандартный код - dput(names(df))
, где df
- ваш data.frame.Например:
dput(names(mtcars))
Производит
c("mpg", "cyl", "disp", "hp", "drat", "wt", "qsec", "vs", "am",
"gear", "carb")
Затем вы можете отредактировать эту строку, чтобы извлечь нужные переменные.Это дает дополнительное преимущество, заключающееся в уменьшении количества ошибок при вводе в коде.И это действительно важный момент.Вы не хотите тратить много времени на отладку кода, который был просто результатом опечатки.Кроме того, сообщение об ошибке Rs при неправильном вводе имени переменной ужасно.Он просто говорит «выбраны неопределенные столбцы».Он не сообщает вам, какие имена переменных были неправильными.
Если у вас большое количество переменных, вы также можете использовать ряд функций поиска строк для извлечения подмножества имен переменных:
Например,
> library(psych)
> dput(names(bfi)) #all items
c("A1", "A2", "A3", "A4", "A5", "C1", "C2", "C3", "C4", "C5",
"E1", "E2", "E3", "E4", "E5", "N1", "N2", "N3", "N4", "N5", "O1",
"O2", "O3", "O4", "O5", "gender", "education", "age")
> dput(grep("^..$", names(bfi), value = TRUE)) # two letter variable names
c("A1", "A2", "A3", "A4", "A5", "C1", "C2", "C3", "C4", "C5",
"E1", "E2", "E3", "E4", "E5", "N1", "N2", "N3", "N4", "N5", "O1",
"O2", "O3", "O4", "O5")
> dput(grep("^E.$", names(bfi), value = TRUE)) # E items
c("E1", "E2", "E3", "E4", "E5")
> dput(grep(".5$", names(bfi), value = TRUE)) # 5th items
c("A5", "C5", "E5", "N5", "O5")
Очистить существующие имена переменных и использовать соглашение об именах
Когда я получаю файл данных от кого-то другого, в именах переменных часто отсутствуют соглашения или соглашения, которые заставляют работатьс переменными, менее полезными в R. Несколько правил, которые я использую:
- делают все переменные в нижнем регистре (необходимость думать о переменных в нижнем и верхнем регистре просто раздражает)
- makeимена переменных по сути значимы (некоторые другие программы используют метки переменных для хранения значимых данных; R на самом деле не использует метки)
- Сохраняйте переменные соответствующей длины (то есть не слишком длинной)До 10 символов в порядке.Более 20 раздражают.
Все эти шаги, как правило, облегчают выбор переменных, так как помнят меньше несоответствий.
Используйте завершение табуляции для отдельных имен переменных
Для отдельных переменных я обычно использую автозаполнение из фрейма данных.Например, df$
и нажмите вкладку.
Я пытаюсь использовать стиль кодирования, который позволяет мне использовать автозаполнение в максимально возможной степени.Мне не нравятся функции, которые требуют, чтобы я знал имя переменной без использования автозаполнения.Например, при подстановке data.frame я предпочитаю от
df[ df$sample == "control", ]
до
subset(df, sample == "control")
, потому что я могу автозаполнить имя переменной "sample" в верхнем примере, но не ввторой.