#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 и вместо этого просто создал вектор таблиц