#r #list #matrix
Вопрос:
Я хотел бы преобразовать три определенных столбца (фрейм данных) в тысячу верхних (или нижних) матриц по 8 признаков каждая в R. Каждая матрица записывается по строкам во фрейме данных. Это пример:
Dataframe with 3 columns (and 12000 rows). From this I need to have 1000 matrices (triangular): col1 col2 col3 row1 1 2 3 row2 2 3 4 row3 7 4 5 row4 1 4 5 row5 2 4 5 row6 3 4 5 . . . . . . . . . . . . row12000 1 6 9
Мне нужно преобразовать их в 1000 матриц (треугольных) по 8 признаков в каждой и поместить их в список: Пример преобразования данных в фрейме данных в первую матрицу:
trait 1 trait2 trait3 trait4 trait5 trait6 trait7 trait8 trait1: 1(row1 col1) trait2: 2(row1 col2) 5(row3 col3) trait3: 3(row1 col3) 1(row4 col1) 3(row6 col1) trait4: 2(row2 col1) 4(row4 col2) 4(row6 col2) value trait5: 3(row2 col3) 5(row4 col3) 5(row6 col3) value value trait6: 4(row2 col3) 2(row5 col1) . value value value trait7: 7(row3 col1) 4(row5 col2) . value value value value trait8: 4(row3 col2) 5(row5 col3) . value value value value value
Ответ №1:
- Сверните по строкам значение матрицы
df
значение фрейма данных () в векторе (all_values
). - Создайте группу из 36 значений и разделите их в списке.
- Поместите каждое из 36 значений в нижнюю треугольную матрицу размером 8 Х 8 и получите список матриц.
all_values lt;- c(t(df)) dummmy_matrix lt;- matrix(nrow = 8, ncol = 8, dimnames = list(paste0('trait', 1:8), paste0('trait', 1:8))) matrix_list lt;- lapply(split(all_values, ceiling(seq_along(all_values)/36)), function(x) { dummmy_matrix[lower.tri(dummmy_matrix, diag = TRUE)] lt;- x dummmy_matrix }) matrix_list
Комментарии:
1. Спасибо. Я ломал голову, чтобы понять, как создать 1000 матриц. Я смог построить один, но не знал, как сделать 1000. Теперь я возьму список матриц и сделаю все матрицы симметричными. Я сделаю:
symm lt;- function(m) { m[upper.tri(m)] lt;- t(m)[upper.tri(m)] m }
а потом:final_matrix = (matrix_list,symm)
.