Проблема с преобразованием фрейма данных в матрицу проекта в r

Я начал с R несколько дней назад, и мне действительно нужна помощь: D В настоящее время у меня есть data.frame с 200 наблюдениями и 12 переменными (они представляют собой клики, поэтому они названы c1-c12).

Фон. Пользователь нажимает (до 12 раз) на поля. Эти поля упорядочены по 6 строкам и 4 столбцам, а клики пользователя записываются в виде числа:

[,1] [,2] [,3] [,4]
[1,] "11" "21" "31" "41"
[2,] "12" "22" "32" "42"
[3,] "13" "23" "33" "43"
[4,] "14" "24" "34" "44"
[5,] "15" "25" "35" "45"
[6,] "16" "26" "36" "46"

Первая цифра каждого значения представляет строку, вторая - столбец. Вот почему они названы 11-16, 21-26 ... 41-46. Значения варьируются от c (11:16, 21:26, 31:36, 41:46), поэтому существует 24 возможных значения.

Мне удалось прочитать данные в R, и первые 10 наблюдений выглядят так:

Мои данные:

    c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12
1   33 43 63 23 34 32 31 41 61  21  NA  NA
2   24 23 22 21 31 61 41 NA NA  NA  NA  NA
3   61 62 63 64 31 32 33 34 41  42  43  44
4   31 32 33 34 21 22 23 24 41  NA  NA  NA
5   11 12 13 14 22 23 32 33 62  63  42  52
6   51 52 53 54 61 62 63 64 31  32  33  34
7   31 21 61 62 63 64 33 23 NA  NA  NA  NA
8   41 42 43 44 32 33 62 63 52  53  61  64
9   61 62 63 64 21 22 24 23 34  31  41  44
10  51 52 53 54 24 34 21 31 33  23  61  63

Я хочу преобразовать свои данные в какую-то матрицу дизайна, основанную на таблице позиций, заданной в фоновом режиме, но: В качестве желаемого результата мне нужна одна матрица для каждого наблюдения, снова содержащая 6 строк и 4 столбцы и 1, когда они щелкнули по полю (т. е. значение позиции является частью наблюдения) и 0 для всех других позиций. Тогда первое наблюдение будет выглядеть так:

0   1   1   1   0   1
0   0   1   0   0   0
0   1   1   1   0   1
0   0   1   0   0   0

Не могли бы вы дать мне советы, какие пакеты и т. Д. Я должен изучить, и, возможно, дать советы в качестве руководства или что-то в этом роде?

Моя идея заключалась в том, чтобы создать матрицу для позиций, а затем умножить их на наблюдения, но в настоящее время я действительно борюсь и не знаю, с чего начать.

Моя матрица позиций в R теперь выглядит так:

#construct design matrix
alt1 <- c(paste0(1, 1:6))
alt2 <- c(paste0(2, 1:6))
alt3 <- c(paste0(3, 1:6))
alt4 <- c(paste0(4, 1:6))
positions <- matrix(c(alt1, alt2, alt3, alt4), nrow = 6)

(предоставлено в фоновом режиме)

** может быть способ более простое и более умное решение, поскольку мои значения содержат rownumber (первая цифра) и columnnr (вторая цифра), но я не знаю, как записать их в матрицу по позиции **

dput(head(data))
structure(list(c1 = c("33", "24", "61", "31", "11", "51"), c2 = c("43", 
"23", "62", "32", "12", "52"), c3 = c("63", "22", "63", "33", 
"13", "53"), c4 = c("23", "21", "64", "34", "14", "54"), c5 = c("34", 
"31", "31", "21", "22", "61"), c6 = c("32", "61", "32", "22", 
"23", "62"), c7 = c("31", "41", "33", "23", "32", "63"), c8 = c("41", 
"", "34", "24", "33", "64"), c9 = c("61", NA, "41", "41", "62", 
"31"), c10 = c("21", NA, "42", "", "63", "32"), c11 = c("", NA, 
"43", NA, "42", "33"), c12 = c(NA, NA, "44", NA, "52", "34")), .Names = c("c1", 
"c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "c11", 
"c12"), row.names = c(NA, 6L), class = "data.frame")

Приветствия и спасибо, Сайдбоб


person sidebob    schedule 28.10.2016    source источник
comment
Не могли бы вы более конкретно рассказать о ваших входах и ожидаемых результатах?   -  person Roman Luštrik    schedule 28.10.2016
comment
Конечно: пользователь нажимает (до 12 раз) на поля. Эти поля расположены в 6 строках и 4 столбцах. Вот почему они названы 11-16, 21-26 ... 41-46. Сейчас я ввел 200 наблюдений (пользователей) и их 12 кликов, записанных в виде чисел. В качестве вывода мне нужна одна матрица для каждого пользователя, содержащая 6 строк и 4 столбца и 1, когда они щелкали поле, и 0, когда они этого не делали.   -  person sidebob    schedule 28.10.2016
comment
Пожалуйста, предоставьте данные в удобной для копирования и вставки форме.   -  person Roman Luštrik    schedule 28.10.2016
comment
Я изменил свой вопрос и привел пример. Приносим извинения за беспорядок и благодарим за ответ!   -  person sidebob    schedule 28.10.2016
comment
Вы можете dput(head(data)) сделать его копируемым?   -  person Ott Toomet    schedule 30.10.2016
comment
Я добавил это в исходный пост! thx ott!   -  person sidebob    schedule 30.10.2016


Ответы (1)


Вы можете получить отдельные строки и преобразовать их в матрицы с помощью простого цикла.

for(row in 1:nrow(data)) {
   x <- as.numeric(data[row,])
   i <- x %% 10
   j <- x %/% 10
   mat <- matrix(0, 6, 6)
   mat[cbind(i,j)] <- 1
   print(mat)
   }

Это дает

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    0    1    1    1    0    1
[2,]    0    0    1    0    0    0
[3,]    0    1    1    1    0    1
[4,]    0    0    1    0    0    0
[5,]    0    0    0    0    0    0
[6,]    0    0    0    0    0    0
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    0    1    1    1    0    1
[2,]    0    1    0    0    0    0
[3,]    0    1    0    0    0    0
[4,]    0    1    0    0    0    0
[5,]    0    0    0    0    0    0
[6,]    0    0    0    0    0    0
    ...

Я не уверен, какой результат вы ожидаете. Вы можете просто распечатать (и вывести в файл с sink()), вы можете write() в файл или можете write.table() в формате, подобном csv.

Кстати, вы можете столкнуться с утверждениями, что циклы медленные и их следует избегать в R, в некотором смысле это правда, но в этом случае он работает нормально и его легко понять.

person Ott Toomet    schedule 30.10.2016
comment
Спасибо за ответ, Отт !, так ты сначала создал матричный мат? ваш фрагмент кода в настоящее время не работает. Мне нужны все маленькие матрицы в текстовом файле, как 1 и 0, одна за другой. Мне они нужны в качестве исходных данных для оценки - person sidebob; 30.10.2016