2014-09-15 2 views
0

Скажем, у меня три столбца в кадре данных. Я хочу объединить их в один столбец. Каждая из трех колонок является бинарным атрибутом, такие как зеленый/желтый, красный/синий, черный/белый, и т.д.Объединить несколько взаимоисключающих столбцов факторов в один столбец

Я хочу, чтобы объединить все их в одну колонку с несколькими

row1=c(0,0,1) 
row2=c(1,0,0) 
row3=c(0,1,0) 
df=data.frame(rbind(row1,row2,row3)) 

ли есть способ объединить каждую из этих столбцов в один столбец? Единственный столбец теперь должен иметь шесть разных факторов вместо двух, которые у него уже есть.

Может ли кто-нибудь показать мне, как закодировать это?

+0

Почему шесть, а не восемь уровней? –

+0

Вы предполагаете, что результат состоит из девяти строк? –

+0

Привет, я думаю, что моему примеру было трудно следовать. Если в каждом столбце красный/синий, черный/белый, зеленый/желтый, каждый столбец имеет только два возможных значения. Представьте, что это автомобиль ... это может быть только один цвет. Поэтому я бы превратил это в 1 столбец: «Цвет», поэтому он имел бы 6 возможных значений, перечисленных выше. Однако, поскольку данные, с которыми я работаю, кодируются 0/1 для каждого столбца, мне нужен способ сделать это понятным. – runningbirds

ответ

2

Вы можете кодировать их так, как если бы вы закодировали двоичное число, назначив для каждой колонки более высокие значения по два. Вы хотите умножить каждую строку на c(1,2,4), а затем взять сумму.

# The multiplier, powers of two 
x <- 2^(seq(ncol(df))-1) 
x 
## [1] 1 2 4 

# The values 
apply(df, 1, function(row) sum(row*x)) 
## row1 row2 row3 
## 4 1 2 

Чтобы добавить это как новый столбец:

df$new <- apply(df, 1, function(row) sum(row*x)) 
df 
##  X1 X2 X3 new 
## row1 0 0 1 4 
## row2 1 0 0 1 
## row3 0 1 0 2 
+0

Я думал, что они искали что-то вроде: 'data.frame (new = factor (c ((1: 2) [row1 + 1], (3: 4) [row2 + 1], (5: 6) [row3 + 1]))) '? – thelatemail

+0

@thelatemail Интересная интерпретация, но поскольку она приводит к шести уровням, как было предложено, возможно, это правильно. Имеет больше смысла, если есть метки к исходным факторам. –

1

Try:

> df 
    X1 X2 X3 
row1 0 0 1 
row2 1 0 0 
row3 0 1 0 
> 
> 
> mm = melt(df) 
No id variables; using all as measure variables 
> 
> mm$new = paste(mm$variable,mm$value,sep='_') 
> 
> mm 
    variable value new 
1  X1  0 X1_0 
2  X1  1 X1_1 
3  X1  0 X1_0 
4  X2  0 X2_0 
5  X2  0 X2_0 
6  X2  1 X2_1 
7  X3  1 X3_1 
8  X3  0 X3_0 
9  X3  0 X3_0 

мм $ новый это столбец вы хотите.

+0

Или 'paste (colnames (df) [col (df)], as.matrix (df), sep =" _ ")' – thelatemail

+0

Очень элегантный один вкладыш. – rnso

0

Может быть, это то, что вы хотите:

> df$X1 = ifelse(df$X1==0,'green','yellow') 
> df$X2 = ifelse(df$X2==0,'red','blue') 
> df$X3 = ifelse(df$X3==0,'black','white') 
> 
> df 
     X1 X2 X3 
row1 green red white 
row2 yellow red black 
row3 green blue black 
> 
> unlist(df) 
    X11  X12  X13  X21  X22  X23  X31  X32  X33 
"green" "yellow" "green" "red" "red" "blue" "white" "black" "black" 
Смежные вопросы