Применение одинаковых коэффициентов к нескольким переменным в R-кадре данных
Я работаю с набором данных, который включает 16 вопросов, в которых набор ответов идентичен (Да, Нет, Неизвестно или Отсутствует). Я обрабатываю данные с помощью R, и я хочу превратить каждую из переменных в фактор. Для одной переменной я мог бы использовать следующую конструкцию:
df <- read.csv("thedata.csv")
df$q1 <- factor(x=df$q1,levels=c(-9,0,1),
labels=c("Unknown or Missing","No","Yes))
Я бы не хотел набирать это 16 раз. Я мог бы сделать это с помощью for()
, но мне было интересно, есть ли более ясный, более R-способ сделать это. Некоторые примеры данных:
structure(list(q1 = c(0, 0, 0, -9, 0), q2 = c(0, 0, 1, 0, 0),
q3 = c(0, 0, 1, 0, 0), q4 = c(1, 1, 0, 0, 0),
q5 = c(0, 1, 1, 1, 1), q6 = c(1, 1, 1, 0, 0),
q7 = c(0, 0, 0, 1, 0), q8 = c(0, 0, 1, 1, 1),
q9 = c(1, 0, -9, 1, 0), q10 = c(1, 0, 0, 0, 0),
q11 = c(0, 1, 1, 0, 0), q12 = c(1, 1, 0, 0, 0),
q13 = c(1, -9, 1, 0, 0), q14 = c(0, 0, 0, 1, 1),
q15 = c(1, 0, 1, 1, 0), q16 = c(1, 1, 1, 1, 1)),
.Names = c("q1", "q2", "q3", "q4", "q5", "q6", "q7",
"q8", "q9", "q10", "q11", "q12", "q13",
"q14", "q15", "q16"),
row.names = c(NA, -5L), class = "data.frame")
Ответы
Ответ 1
df[] <- lapply(df, factor,
levels=c(-9, 0, 1),
labels = c("Unknown or Missing", "No", "Yes"))
str(df)
Скорее всего, это будет быстрее, чем применять или использовать, которые нуждаются в data.frame для реформирования/переклассификации этих результатов. Хитрость здесь заключается в том, что использование []
в LHS присваивания сохраняет структуру цели (поскольку R "знает", что такое его класс и размеры, а необходимость data.frame
в списке из lapply
не является Если бы вы хотели сделать это только с выбранными столбцами, вы могли бы сделать это:
df[colnums] <- lapply(df[colnums], factor,
levels=c(-9, 0, 1),
labels = c("Unknown or Missing", "No", "Yes"))
str(df)
Ответ 2
Базовое решение R с использованием apply
data.frame(apply(df, 2, factor,
levels=c(-9, 0, 1),
labels = c("Unknown or Missing", "No", "Yes")))
Используя sapply
data.frame(sapply(df, factor, levels=c(-9, 0, 1),
labels = c("Unknown or Missing", "No", "Yes")))