соединить много переменных сразу в R

58
7

Мне было интересно, есть ли способ в R, чтобы влиять на многие переменные с помощью СУХОГО способа. Так что давайте скажем, что у меня было 15 фиктивных переменных, все закодированные с 0 и 1. R по умолчанию делает 0 ссылочной категорией, как я могу использовать функции factor и release, чтобы изменить опорный уровень для всех 15 переменных равными 1. Это можно сделать в цикле? Что-то вроде:

varList <- list("V1", "V2", "V3", "V4", "V5", "V6", "V7", 
"V8", "V9", "V10", "V11", "V12", "V13", "V14", "V15")

for (i in varList) {
df$i <- factor(df$i)
df$i <- relevel(df$i, ref = "1")
}

спросил(а) 2015-07-06T20:11:00+03:00 5 лет, 3 месяца назад
1
Решение
90

Вы можете использовать [[ для доступа к переменным следующим образом:

for (i in varList) {
df[[i]] <- relevel(factor(df[[i]]), ref = "1")
}

Альтернативой для применения одного и того же преобразования ко многим столбцам кадра данных является использование функции dplyr mutate_each:

library(dplyr)
var_vector <- c("V1", "V2", "V3", "V4", "V5", "V6", "V7",
"V8", "V9", "V10", "V11", "V12", "V13", "V14", "V15")

relev <- function(f) relevel(factor(f), ref = "1")

df <- mutate_each(df, funs(relev), one_of(var_vector))

Если столбцы, которые вы хотите преобразовать, следуют определенной схеме, вы можете просто сделать что-то вроде:

# transform columns that start with V
df <- mutate_each(df, funs(relev), starts_with("V"))
# transform columns that have V then a number
df <- mutate_each(df, funs(relev), matches("^V\\d+"))

ответил(а) 2015-07-06T20:14:00+03:00 5 лет, 3 месяца назад
71

Мы можем использовать set from data.table для изменения нескольких столбцов в цикле. Он очень эффективен, так как издержки [.data.table исключены.

library(data.table)#v1.9.5
setDT(df)
nm1 <- unlist(varList)

for(j in nm1){
set(df, i=NULL, j=j, value=relevel(factor(df[[j]]), ref="1"))
}

str(df)

данные

set.seed(12)
df <- as.data.frame(matrix(as.character(sample(0:9, 20*100,
replace=TRUE)), ncol=20))

ответил(а) 2015-07-06T20:53:00+03:00 5 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема