2013-12-04 5 views
3

Мы данного вектора, например:Преобразование вектора data.frame, один столбец для каждого уникального значения

x <- c(1,2,1,5,2,1,2,5,1) 

Что нам нужно, это data.frame сказать y, имеющий число строк, равное length(x) и номер столбцы, равных length(unique(x)), это означает, что один столбец за уникальный элемент в x, таким образом, что y[i,j]==TRUE тогда и только тогда, когда i й элемент x является j-й уникального элемента x (присвоено колонке j):

y <- data.frame("1"=x==1, "2"=x==2, "5"=x==5, check.names=F) 

Простой способ выполнить это:

y <- setNames(data.frame(sapply(unique(x), function(i) x==i)), unique(x)) 

У вас есть идея получше (т.е. особая функция)?

+0

Есть ли что-то в вашем подходе, что вы недовольны? – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto, имеющее сопутствующее влияние, может быть не таким эффективным, как ваш, и, более конкретно, я хотел изучить прямое решение R для этого спроса. – Ali

ответ

3

Если вы можете жить с двоичным представлением вместо логического представления данных, я бы просто использовать table :

y <- table(seq_along(x), x) 

Чтобы получить data.frame, используйте as.data.frame.matrix:

as.data.frame.matrix(y) 
# 1 2 5 
# 1 1 0 0 
# 2 0 1 0 
# 3 1 0 0 
# 4 0 0 1 
# 5 0 1 0 
# 6 1 0 0 
# 7 0 1 0 
# 8 0 0 1 
# 9 1 0 0 
3

Как насчет использования outer?

outer(x , unique(x) , `==`) 
#  [,1] [,2] [,3] 
# [1,] TRUE FALSE FALSE 
# [2,] FALSE TRUE FALSE 
# [3,] TRUE FALSE FALSE 
# [4,] FALSE FALSE TRUE 
# [5,] FALSE TRUE FALSE 
# [6,] TRUE FALSE FALSE 
# [7,] FALSE TRUE FALSE 
# [8,] FALSE FALSE TRUE 
# [9,] TRUE FALSE FALSE 

Очевидно Финишная все прочь бы окружив его, как так ...

setNames(data.frame(outer(x , unique(x) , `==`)) , unique(x)) 
+0

+1 Ваш ответ тоже замечательный. – Ali

Смежные вопросы