Использование функции вставки в colnames

#r #paste

#r #вставить

Вопрос:

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

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

 cnames <- c("Honda", "Toyota", "Nissan")
  

Создание самих таблиц, похоже, отлично работает с функцией assign:

 for (i in 1:length(cnames)){
    assign(paste(cnames[i],"table",sep="_"), matrix(,nrow=2,ncol=2))
}
  

Который, когда я печатаю, например:

 > Honda_table
  

…возвращает:

    [,1] [,2]
[1,]  NA   NA
[2,]  NA   NA
  

Но если в исходной итеративной функции я пытаюсь присвоить имена столбцов, например, такие:

 for (i in 1:length(cnames)){
    assign(paste(cnames[i],"table",sep="_"), matrix(,nrow=2,ncol=2))
    colnames(paste(cnames[i],"table",sep="_")) <- c("A","B")
    }
  

…Вместо этого я получаю эту ошибку:

 Error : attempt to set 'colnames' on an object with less than two dimensions
  

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

 >dim(honda_table)
  

…Я получаю:

 [1] 2 2
  

Что указывает на то, что это объект размером 2×2.

Более того, я не могу присвоить предварительно установленные значения ячейкам матрицы, например:

 for (i in 1:length(cnames)){
    assign(paste(cnames[i],"table",sep="_"), matrix(,nrow=2,ncol=2))
    paste(cnames[i],"table",sep="_")[1,1] = 1
}
  

…без получения этой ошибки:

 Error : incorrect number of subscripts on matrix
  

Что здесь происходит?

Спасибо.

Комментарии:

1. Вы пытаетесь вызвать colnames строку вместо имени объекта. Есть способы обойти это, но они не поощряются (как и использование assign ). Вместо вашего for цикла создайте список с lapply помощью .

2. Это: colnames(paste(cnames[i],"table",sep="_")) <- c("A","B") пытается установить colnames только один элемент (например "Honda" ). Должно быть, поэтому ваши размеры отключены.

3. @alistaire пример с lapply? Я думаю, я понимаю, к чему вы клоните

4. Немного неуклюжий, но setNames(lapply(cnames, function(x){matrix(nrow = 2, ncol = 2, dimnames = list(NULL, c('A', 'B')))}), cnames) . Поочередно, setNames(rep(list(matrix(nrow = 2, ncol = 2, dimnames = list(NULL, c('A', 'B')))), length(cnames)), cnames)

5. Этот вопрос требует некоторых fortunes::fortune(236)

Ответ №1:

Я не уверен, что это лучший и самый красивый способ, но, похоже, работает:

 for (i in 1:length(cnames)){
 tab<- matrix(,nrow=2,ncol=2)
 colnames(tab)<-  c("A","B")
 assign(paste(cnames[i],"table",sep="_"), tab)
 }
rm(tab)
  

Комментарии:

1. это может сработать, просто интересно, есть ли способ сделать это без функции assign, если нет, я отдам должное этому ответу. Не могу поверить, что я об этом не подумал.

Ответ №2:

После долгих предложений я закончил очисткой функции assign и вместо этого просто создал вектор таблиц