Предполагая, что ваши данные введены в data.frame, называемом dat
, скажем, два фактора приведены в этом примере:
> dat <- data.frame(f1=sample(LETTERS[1:3],20,T),f2=sample(LETTERS[4:5],20,T),id=1:20)
> dat
f1 f2 id
1 C D 1
2 B E 2
3 B E 3
4 A D 4
5 C E 5
6 C E 6
7 C D 7
8 B E 8
9 C D 9
10 A D 10
11 B E 11
12 C E 12
13 B D 13
14 B E 14
15 A D 15
16 C E 16
17 C D 17
18 C D 18
19 B D 19
20 C D 20
> dat$f1
[1] C B B A C C C B C A B C B B A C C C B C
Levels: A B C
> dat$f2
[1] D E E D E E D E D D E E D E D E D D D D
Levels: D E
Вы можете использовать outer
, чтобы получить матрицу как вы показали, для каждого фактора:
> F1 <- with(dat, outer(f1, levels(f1), `==`)*1)
> colnames(F1) <- paste("f1",sep="=",levels(dat$f1))
> F1
f1=A f1=B f1=C
[1,] 0 0 1
[2,] 0 1 0
[3,] 0 1 0
[4,] 1 0 0
[5,] 0 0 1
[6,] 0 0 1
[7,] 0 0 1
[8,] 0 1 0
[9,] 0 0 1
[10,] 1 0 0
[11,] 0 1 0
[12,] 0 0 1
[13,] 0 1 0
[14,] 0 1 0
[15,] 1 0 0
[16,] 0 0 1
[17,] 0 0 1
[18,] 0 0 1
[19,] 0 1 0
[20,] 0 0 1
Теперь сделайте то же самое для второго фактора:
> F2 <- with(dat, outer(f2, levels(f2), `==`)*1)
> colnames(F2) <- paste("f2",sep="=",levels(dat$f2))
И cbind
их, чтобы получить окончательный результат:
> cbind(F1,F2)
Я нашел ответ:
class WindowProgram(Tkinter.Frame)
""" This class creates a frame for my program window """
def __init__(self, parent):
Tkinter.Frame.__init__(self, parent)
class App(Tkinter.Tk):
""" application constructor """
def __init__(self):
Tkinter.Tk.__init__(self)
self.window_program = Window_Program(self)
Зачем вам нужен класс, создающий несколько фреймов? Создание одного класса, который создает несколько фреймов, - не очень хорошее решение. Для этого не нужен ни один класс.
Либо создайте отдельные классы для каждого кадра, либо просто создайте в своем приложении методы для создания каждого кадра. Я предпочитаю последнее, но если вам нужен фрейм, который можно использовать в нескольких контекстах, иногда имеет смысл создать класс.
Когда я создаю графический интерфейс, я структурирую свой код следующим образом:
class App(Tkinter.Tk):
def __init__(self):
Tkinter.Tk__init__(self)
self.menubar = self.makeMenubar(...)
self.frame1 = self.makeFrame1(...)
self.frame2 = self.makeFrame2(...)
self.configure(menu=self.menubar)
self.frame1.grid(...)
self.frame2.grid(...)
Таким образом, каждый основной раздел получает свой собственный метод, чтобы скрыть детали создания виджета. Конечно, вы можете сделать каждый фрейм индивидуальным объектом, но обычно в этом нет необходимости.