2015-08-23 2 views
1

У меня есть список, подобный этому:R: Из отдельных столбцов столбцов классов X

yellow, green, blue, yellow,... 

с 30 различных уровней. Однако в списке не отображается уровень.

И я хотел бы создать кадр данных, как это:

yellow green blue orange 
1   0  0  0 
0   1  0  0 
0   0  1  0 
1   0  0  0 

Примечания есть столбец с именем оранжевым, даже если цвет не в списке не появляется.

Я уже пытался использовать dcast, расплав и другие функции из пакета reshape2. Кроме того, я уверен, что на этот вопрос должен быть ответ, однако я не смог его найти (возможно, я не использовал лучшие ключевые слова в Google).

Благодаря

EDIT: Изменены формы данных и объяснения.

ответ

4

Простой table должен сделать это в базе R:

table(rownames(mydf), mydf$RESULT) 
##  
##  blue green yellow 
## 1 0  0  1 
## 2 0  1  0 
## 3 1  0  0 
## 4 0  0  1 

Другие варианты:

model.matrix(~RESULT + 0, mydf) 
## RESULTblue RESULTgreen RESULTyellow 
## 1   0   0   1 
## 2   0   1   0 
## 3   1   0   0 
## 4   0   0   1 
## attr(,"assign") 
## [1] 1 1 1 
## attr(,"contrasts") 
## attr(,"contrasts")$RESULT 
## [1] "contr.treatment" 
## 

или

library(reshape2) 
dcast(mydf, rownames(mydf) + RESULT ~ RESULT, fun.aggregate = length, 
    value.var = "RESULT") 
## rownames(mydf) RESULT blue green yellow 
## 1    1 yellow 0  0  1 
## 2    2 green 0  1  0 
## 3    3 blue 1  0  0 
## 4    4 yellow 0  0  1 

Для простого вектора, просто попробуйте:

table(1:length(yourVec), yourVec) 

или

model.matrix(~ vec + 0) 

Используйте levels аргумент в factor для изменения вектора перед тем с использованием любого из этих подходов, чтобы убедиться, что вы захватить любые значения, которые не могут быть в установленный, но который вы хотите на выходе (пример «оранжевый»).

+0

Спасибо за быстрый ответ. Я получаю эту ошибку «все аргументы должны иметь одинаковую длину». Возможно, я неправильно объяснил свою проблему. У меня в настоящее время есть один вектор (зеленый, синий, синий, ... и т. Д.), Однако он состоит из 39 разных уровней, и не все они появляются в векторе (у него около 200 тыс. Элементов). – user3276768

+0

@ user3276768, затем используйте подход 'table', но измените его на нечто вроде' table (1: length (yourVec), yourVec) '. – A5C1D2H2I1M1N2O1R2T1

+0

@ user3276768, также смотрите на функцию 'factor'. – A5C1D2H2I1M1N2O1R2T1