2014-12-06 2 views
0

Я знаю, что это было задано раньше, но у меня возникли проблемы с пониманием того, что я нашел. Я ищу создать массив фиксированной длины массива двойников в R, что было бы правильным объявлением для этого? Я думаю, что хочу быть в состоянии выдвинуть элементов в этих массивах, что-то вроде array[1][]=0.1, array[2][]=0.2 и т.д.R фиксированная длина массива пустых массивов

+1

Как это отличается от двухстрочной матрицы с N столбцами? Определение списка длины N и заполнение его двумя векторами элементов также легко. –

+0

Я нажимаю элементы внутри петли, чтобы в итоге было N массивов разной длины. –

+0

Тогда это всего лишь список. Где осложнение? –

ответ

0

Один из способов сделать это:

list_a<-vector("list",number_of_vectors) , а затем установить каждый элемент списка с помощью

list_a[[i]]<-c(list_a[[i]],num_to_push_back); и т. д. для каждого i.

Вы можете вырастить векторы в списке - но это не очень желательно, чтобы вырастить вещи в R ...

Затем вы можете сделать list_a[[a]][b] для вашего массива. Но синтаксис трагичен, и я уверен, что производительность будет медленнее, чем Джексон на пропофоле.

Другой, более «R-идиоматический» способ избежать использования оборванных массивов может состоять в том, чтобы предварительно выделить (или создать/независимо) матрицу с размерами, большими, чем длина вашего самого большого вектора. Недостающие значения более коротких векторов могут быть заполнены NA - многие/большинство функций в R предназначены для работы с NA. Или просто используйте функцию na.omit при использовании векторов. Например,

Not_a_ragged_array=matrix(NA,10,10) #a 10 by 10 matrix filled with NAs 
#fill each column with a vector of random numbers, of random length 
num_rows=sample.int(9,10,replace=TRUE); for(i in 1:10){Not_a_ragged_array[1:num_rows[i],i]=rbinom(num_rows[i],10,0.8)} 
Not_a_ragged_array 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
# [1,] 8 9 7 8 7 10 8 7 9  9 
# [2,] 8 10 NA 6 8 9 8 NA 8  6 
# [3,] 7 7 NA 10 7 9 9 NA 9  9 
# [4,] NA 9 NA 6 10 7 NA NA 6  9 
# [5,] NA 5 NA 9 7 6 NA NA NA  9 
# [6,] NA 8 NA 9 9 NA NA NA NA  8 
# [7,] NA NA NA 9 NA NA NA NA NA  9 
# [8,] NA NA NA 8 NA NA NA NA NA  8 
# [9,] NA NA NA NA NA NA NA NA NA NA 
#[10,] NA NA NA NA NA NA NA NA NA NA 

as.vector(na.omit(Not_a_ragged_array[,1])) #get individual vectors like this 
#[1] 8 8 7 
+0

Это функциональность, которую я искал. Не слишком знакомы с типами данных R и производительностью - есть ли более целесообразный способ этого? –

+0

Это нормально. Обычно люди задают вопросы, когда они не знакомы с ответом ... так что это ожидалось. Я * думаю * это единственный (другие методы - это варианты этого) пути в R, чтобы создать объект, который вы ищете (оборванный массив). Вы можете посмотреть здесь варианты на ту же тему: http://www.r-bloggers.com/efficient-ragged-arrays-in-r-and-rcpp/. Чтобы определить, действительно ли ваша * актуальная * проблема требует использования оборванного массива, вам нужно будет узнать больше о вашей проблеме. Я отредактировал ответ с более «идиоматическим» предложением, чтобы избежать оборванных массивов. –

Смежные вопросы