2014-01-27 3 views
2

У меня есть кадр данных, который выглядит следующим образом:Преобразование простого кадра данных

ID Club Type 
1 1 arsenal 18 
2 1 arsenal 31 
3 1 arsenal 32 
4 1 arsenal 14 
5 2 chelsea 14 
6 2 chelsea 31 
7 2 chelsea 15 
8 2 chelsea 32 
9 3 fulham 27 
10 3 fulham 31 

Я хочу, чтобы превратить его в нечто вроде этого:

ID Club 14 15 18 27 31 32 
1 1 arsenal 1 0 1 0 1 1 
2 2 chelsea 1 1 0 0 1 1 
3 3 fulham 0 0 0 1 1 0 

Таким образом, в преобразованном кадре данных, если тип соответствует определенному клубу, тогда ему присваивается значение 1 и значение 0 в противном случае.

Моя структура данных немного больше, чем это (в противном случае я буду делать все вручную).

Может кто-нибудь дать мне предложение относительно того, как я буду заниматься этим? Мои проблемы вытекают из того факта, что:

  • типа появляются несколько раз
  • Я не знаю, как я бы идти о вставке двоичных значений (я понимаю, что я мог бы, вероятно, сделать что-то, что возвращает True/False)
  • идентификатор элементы должны разрушиться в один элемент
+1

Посмотрите на функции 'cast' или' dcast' в пакетах 'reshape' или' reshape2'. Я уверен, что вы можете найти множество примеров перехода от «длинного формата» к «широкому формату» в R. –

+0

Мне не было известно ни об одном из этих пакетов - я сейчас посмотрю на них. спасибо за предложение! – user1988898

ответ

3
library(reshape2) 

df <- read.table("clipboard",header=T) 

dcast(df, ID + Club ~ Type, length) 

    ID Club 14 15 18 27 31 32 
1 1 arsenal 1 0 1 0 1 1 
2 2 chelsea 1 1 0 0 1 1 
3 3 fulham 0 0 0 1 1 0 
2

reshape альтернатива в R не очень красиво, но вы можете попробовать:

x <- data.frame(table(mydf[-1]))   # Drop "ID" when tabulating 
x$Freq <- as.numeric(as.logical(x$Freq)) # In case any are > 1 
y <- reshape(x, direction = "wide", idvar="Club", timevar="Type") 
merge(unique(mydf[1:2]), y)    # Reintroduce the ID 
#  Club ID Freq.14 Freq.15 Freq.18 Freq.27 Freq.31 Freq.32 
# 1 arsenal 1  1  0  1  0  1  1 
# 2 chelsea 2  1  1  0  0  1  1 
# 3 fulham 3  0  0  0  1  1  0 
+0

Каждый раз, когда я пытаюсь использовать форму на основе, я хочу ударить головой о стену. –

+0

@BrandonBertelsen, это не так плохо, как только вы его используете несколько раз. Моя наименее любимая часть этого ответа здесь - «merge», потому что она не всегда эффективна и иногда делает забавные вещи с порядком вывода. – A5C1D2H2I1M1N2O1R2T1

+0

Я так считаю. Но он чувствует себя немного неуклюжим, если вы «взрослый» с изменением формы/2 –

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