Присвоение одинаковых имен столбцов / строк многим матрицам в цикле For Loop - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть целая куча матриц, которым я хочу присвоить имена столбцов и строк на основе столбца имен, которые содержатся в другом столбце (Имена) в кадре данных (месяцы), который у меня есть.

Каждая матрица, которой я хочу присвоить имена, соответствует объединенной «партнерской» строке и метрике, хранящейся здесь, например, одна из матриц называется «facebook_Total_Completed_Rentals»:

Metrics = c('_Total_Completed_Rentals','_Registered_Completed_rentals',
'_Registered_renters','_New_Registrations')

Partners = c('facebook', 'altrooz', 'adperio', 'snapchat', 'apple', 'google')    

Я хочу просмотреть эти две последовательности, чтобы назначитьимена для матриц таким способом, чтобы избежать необходимости вручную кодировать все операторы colnames и row.names:

for(i in 1:length(Metrics)){
  for(j in 1:length(Partners)){
  temp = paste0(Partners[j],Metrics[i])
  colnames(temp)= months$Names[1:(months_cut-1)]
  row.names(temp) = months$Names[1:(months_cut-1)]
  }
}  

Но я получаю ошибку:

Error in `colnames<-`(`*tmp*`, value = months$Names[1:(months_cut - 1)]) : 
attempt to set 'colnames' on an object with less than two dimensions

Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Хотя ответ @ Moody's, вероятно, является более чистым вариантом, я подумал, что предоставлю код, который делает то, что вы изначально хотели, чтобы он делал:

Давайте создадим 4 матрицы, имена которых представляют собой комбинации из 2 элементов:

a_1 <- a_2 <- b_1 <- b_2 <- matrix(1:20, ncol = 5)

Вектор имен строк и имен столбцов:

rnames <- paste0("row_", 1:4)
cnames <- paste0("col_", 1:5)

Получите элементы name:

x <- c("a", "b")
y <- 1:2

Для вашего цикла вам необходимо понять, что tempэто просто строка символов, поэтому colnames(temp) не будет работать.Вы хотите создать строку, которая включает всю команду, проанализировать ее как выражение и затем оценить ее:

for (i in x) {
  for (j in y) {
    temp <- paste(i, j, sep = "_")
    eval(parse(text = paste0("dimnames(", temp, ") <- list(rnames, cnames)")))
  }
}

Примечание.dimnames(temp) быстрее rownames и colnames.

0 голосов
/ 27 ноября 2018

Рассмотрим следующие data.frames:

iris_a  <- iris[1:2,]
iris_b  <- iris[3:4,]
iris_c  <- iris[5:6,]

Чистый способ сделать то, что вы хотите, это поместить их в список и применить к нему изменения:

rnms <- c("foo","bar")
your_list <- lapply(list(iris_a = iris_a,iris_b = iris_b, iris_c = iris_c), function(x){
  rownames(x) <- rnms
  x
})

Тогдапри необходимости вы можете извлечь его элементы обратно в локальную среду:

list2env(your_list, environment())
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# foo          5.1         3.5          1.4         0.2  setosa
# bar          4.9         3.0          1.4         0.2  setosa

Немного более компактно, используя tidyverse:

your_list <- map(lst(iris_a, iris_b, iris_c), `rownames<-`, rnms)
...