2016-08-19 2 views
0

У меня есть набор данных, который содержит 900 столбцов числовых данных, и мне нужно преобразовать числовые столбцы в факторы, имеющие метки. Многие ярлыки будут повторяться. Я пытаюсь написать функцию, которая будет принимать числовые столбцы, определить тип метки, который нужен столбцу, а затем применить эту метку.Преобразование числовых столбцов в факторы с разными метками с использованием ключа

Вот кадр примера данных:

#create data frame with columns a,b,c,d 
a<-c(1,2,3,4,5) 
b<-c(0,1,0,1,0) 
c<-c(1,0,1,0,1) 
d<-c(2,3,4,5,3) 

x<-as.data.frame(cbind(a,b,c,d)) 

У меня есть отдельный dataframe (т.е. у), который включает в себя ключ (т.е. столбец е), который идентифицирует, какой фактор метка должна быть применена к какому из столбцов (т.е. столбец f). Обратите внимание, что b и c должны иметь одну и ту же метку.

e<-c(1,2,2,3) 
f<-c("a","b","c","d") 

y<-as.data.frame(cbind(e,f)) 

Я хотел бы написать функцию, которая выполняет следующие функции, но автоматизирована. Вот примеры ярлыков, которые я хотел бы применить к a, b, c, d - где a и d - разные, но b и c одинаковы.

x$a<-factor(x$a, 
    levels=c(1,2,3,4,5), 
    labels=c("Less than 25%", 
    "25-50%", 
    "51-75%", 
    "76-90%", 
    "More than 90%")) 

x$b<-factor(x$b, 
    levels=c(0,1), 
    labels=c("Yes","No")) 

x$c<-factor(x$c, 
    levels=c(0,1), 
    labels=c("Yes","No")) 

x$d<-factor(x$c, 
    levels=c(1,2,3,4,5), 
    labels=c("l","m","n","o","p")) 

С окончательных данных набор выглядит как:

>x 
       a b c d 
1 Less than 25% Yes No m 
2  25-50% No Yes n 
3  51-75% Yes No o 
4  76-90% No Yes p 
5 More than 90% Yes No n 

В фактическом наборе данных, будет близка к 60 этикеток.

+0

У вас есть информация о том, какие уровни и метки для каждой переменной должны храниться где-нибудь или вы используете какую-то логику, вам, какими должны быть уровни и метки? – aosmith

+0

У меня есть уровни и метки, но их нужно будет написать вручную. – Sam

+1

Если они еще не хранятся в любом месте, я не уверен, как вы можете писать уровни и метки, если нет какой-либо логики, которая может быть использована на основе фактического набора данных, чтобы угадать, какими они должны быть. В вашем примере, однако, я не вижу, что может быть логикой, особенно для ярлыков. – aosmith

ответ

1

Если вы можете получить метки и уровни, соответствующим образом связанные с столбцом e, который является вашей ссылкой на столбцы набора данных, вы можете сделать это через purrr:pmap_df.

Вот как это будет выглядеть. Большая часть работы заключается в получении меток и уровней в виде столбца списка, который я делаю через tibble (загружен с dplyr).

Начиная с вашего второго набора данных, y, что является важной частью этого.

e = c(1,2,2,3) 
f = names(x) 

y = data.frame(e,f) 

    e f 
1 1 a 
2 2 b 
3 2 c 
4 3 d 

Убедитесь, что уровни и этикетки доступны и могут быть связаны с e вектором. Если они в длинном формате, вы можете получить их в формате списка столбцов через tidyr::nest. Я нашел это самым трудоемким шагом в плане получения этой информации.

library(dplyr) 

levels.labels = tibble(e = c(1, 2, 3), 
      levels = list(1:5, 0:1, 1:5), 
      labels = list(c("Less than 25%", 
          "25-50%", 
          "51-75%", 
          "76-90%", 
          "More than 90%"), 
          c("Yes","No"), 
          c("l","m","n","o","p"))) 

Если вам нужно написать свои уровни и этикетки в рамках R вы можете попробовать tribble, который доступен в разрабатываемой версии в Тиббл пакета .

library(tibble) 
levels.labels = tribble(~e, ~levels, ~labels, 
     1, 1:5, c("Less than 25%", 
       "25-50%", 
       "51-75%", 
       "76-90%", 
       "More than 90%"), 
     2, 0:1, c("Yes","No"), 
     3, 1:5, c("l","m","n","o","p")) 

Merge уровни и метки с y набора данных на основе e. Строки результата соответствуют совпадению от 1 до 1 столбцов x.

key = left_join(y, levels.labels) 

    e f  levels            labels 
1 1 a 1, 2, 3, 4, 5 Less than 25%, 25-50%, 51-75%, 76-90%, More than 90% 
2 2 b   0, 1            Yes, No 
3 2 c   0, 1            Yes, No 
4 3 d 1, 2, 3, 4, 5          l, m, n, o, p 

Чтобы указать каждый столбец, поместите набор данных x, уровни и метки в список имен. Имена каждого элемента соответствуют именам аргументов, которые необходимо использовать от factor. Это позволяет легко использовать pmap_df от purrr до factor каждый столбец x, используя информацию об известных уровнях и этикетках.

library(purrr) 
pmap_df(list(x = x, levels = key$levels, labels = key$labels), factor) 

# A tibble: 5 x 4 
       a  b  c  d 
     <fctr> <fctr> <fctr> <fctr> 
1 Less than 25% Yes  No  m 
2  25-50%  No Yes  n 
3  51-75% Yes  No  o 
4  76-90%  No Yes  p 
5 More than 90% Yes  No  n 

В pmap функции, элементы в списке должны быть одинакового размера. В этом случае первый элемент имеет 4 столбца, а второй - это векторы длиной 4.

+0

Будет ли способ вводить уровни, метки и ключи в excel или что-то еще, а затем импортировать их в R для части этого? Каким будет идеальный метод ввода, чтобы избежать разделения записи значений уровня/метки? Похоже, было бы намного проще сделать все это сразу, возможно, за столбцом, а не писать уровни, затем прокручивать вниз, чтобы записать ярлык, затем снова вернуться на уровень и т. Д. – Sam

+0

Имея таблицу или другой документ для хранения ваших уровней, меток и т. д. представляется разумным. Вышеприведенное было просто примером того, как будет выглядеть таблица, а не рекомендацией о том, как вводить их, поскольку я не знаю, как они хранятся в настоящее время. Другой возможной возможностью для ввода данных является сохранение их в длинном формате (например, одна строка для каждого уровня) и использование 'tidyr :: nest', как только вы их прочитаете в R. – aosmith

+0

Когда я пытаюсь это сделать на моем фактическом наборе данных, окончательный pmap_df пуст. Имена столбцов есть, но все данные в data.frame отсутствуют. Удивление, что пошло не так. I * сделал * получить предупреждающее сообщение при объединении слева: Соединение, by = "e" Предупреждающее сообщение: В left_join_impl (x, y, по $ x, по $ y, суффикс $ x, суффикс $ y): присоединение факторы с разными уровнями, принуждение к символьному вектору – Sam