2014-10-15 2 views
1

Цель, которую я пытаюсь достичь, - это взять столбец фрейма данных, который является фактором, создать новый столбец для каждого уровня и заполнить столбец соответствующим значением для этого уровня из исходного кадра данных.Как развернуть столбец фактора кадра данных в один столбец за уровень в R?

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

Оригинал dataframe:

symbol  the.name   cn  
SYM1   ABC    1 
SYM2   ABC    2 
SYM1   DEF    3 
SYM2   DEF    4 

Результирующая dataframe:

symbol  ABC  DEF 
SYM1   1   3 
SYM2   2   4 

Как это можно сделать?


EDIT: Я пытался добиться этого, используя sapply петлю с split колонкой, а затем rbind ИНГ результаты. Тем не менее, я не получил его на работу и решил не добавлять его в этот вопрос, так как это создавало бы шум - я уверен, что этот метод неверен и может быть значительно улучшен.

+0

Любопытно, почему существует нижний предел? Похож на хороший вопрос, но я мог бы что-то упустить –

+0

Возможно, что downvoter хотел подчеркнуть, что это очень распространенный вопрос. – ilir

+2

Не проголосовавший, но я полагаю, потому что ОП не показал, что они что-то пробовали –

ответ

5

Это задача изменения формы (с длиной до широких данных). В пакете reshape2 есть несколько полезных утилит для этого.

txt="symbol  the.name   cn  
     SYM1   ABC    1 
     SYM2   ABC    2 
     SYM1   DEF    3 
     SYM2   DEF    4" 

tmp <- read.table(text=txt, header=TRUE) 

library(reshape2) 
dcast(tmp, symbol ~ the.name) ## as easy as that 
5

Это работа для dcast из пакета reshape2:

> dcast(df, symbol~the.name, value.var="cn") 
    symbol ABC DEF 
1 SYM1 1 3 
2 SYM2 2 4 
+0

должен указать, что вам нужна библиотека («reshape2») '... –

+0

@BenBolker благодарит, использовал ее так долго, что забыл, что это не база. –

5

В качестве альтернативы, довольно новый tidyr пакет предоставляет делает это с помощью функции «размытого». Использование данных @ ilir

> tidyr::spread(tmp, key = the.name, value = cn) 
    symbol ABC DEF 
1 SYM1 1 3 
2 SYM2 2 4