Я начал использовать R сегодня, поэтому я прошу прощения, если это слишком просто.

Сначала я строю 2 матрицы и строю вектор, элементами которого являются эти матрицы. Затем я пытаюсь перебрать элементы вектора, то есть матрицы. Однако, когда я это делаю, я получаю ошибку «аргумент нулевой длины».

cam <- 1:12
ped <- 13:24

dim(cam) <- c(3,4)
dim(ped) <- c(4,3)

mats <- c('cam','ped')

for (i in  1:2) {
  rownames(mats[i]) <- LETTERS[1:dim(mats[i])[1]]
  colnames(mats[i]) <- LETTERS[1:dim(mats[i])[2]]
}

Текст ошибки выглядит следующим образом:

Error in 1:dim(mats[i])[1] : argument of length 0

Вопрос: как зациклить элементы вектора, причем эти элементы являются матрицами? (Полагаю, я неправильно называю элементы). Спасибо за терпение.

0
k1000x 28 Май 2017 в 07:36

2 ответа

Лучший ответ

Опция перехода в R заключается в использовании списков:

cam <- 1:12 ; dim(cam) <- c(3,4)
# same as matrix(1:12, nrow = 3, ncol = 4)
ped <- 13:24 ; dim(ped) <- c(4,3)

# save the list ( '=' sign for naming purposes only here)
mats <- list(cam = cam, ped = ped)

# notice the double brackets '[[' which is used for picking the list
for (i in  1:length(mats) {
  rownames(mats[[i]]) <- LETTERS[1:dim(mats[[i]])[1]]
  colnames(mats[[i]]) <- LETTERS[1:dim(mats[[i]])[2]]
}

# finally you can call the whole list at once as follows:
mats
# or seperately using $ or [[
mats$cam # mats[['cam']]
mats$ped # mats[['ped']]

< Сильный > АЛЬТЕРНАТИВЫ

Если вы действительно хотите сойти с ума, вы можете воспользоваться функциями get() и assign(). get() вызывает объект за символом, и assign() может создать его.

mats <- c('cam','ped')
mats.new <- NULL # initialize a matrix placeholder
for (i in  1:length(mats)) {
  mats.new <- get(mats[i]) # save as a new matrix each loop
  # use dimnames with a list input to do both the row and column at once
  dimnames(mats.new) <- list(LETTERS[1:dim(mats.new)[1]],
                             LETTERS[1:dim(mats.new)[2]]) 
  assign(mats[i],mats.new) # create (re-write) the matrix
}
2
Evan Friedland 28 Май 2017 в 04:57

Если наборы данных помещены в list, мы можем использовать lapply

lst <- lapply(mget(mats), function(x) {
         dimnames(x) <-  list(LETTERS[seq_len(nrow(x))], LETTERS[seq_len(ncol(x))])
    x})

Лучше держать его в list. В случае, если оригинальные объекты должны быть изменены

list2env(lst, envir = .GlobalEnv)
1
akrun 28 Май 2017 в 04:55