2013-02-23 5 views
4

(Я окончательно использую неправильную терминологию в этом вопросе, извините за это - я просто не знаю, как правильно описать это в терминах R ...)многомерный список? Список списков? массив списков?

Я хочу создать структуру гетерогенных объектов. Размеры не обязательно прямоугольные. Что мне нужно было бы, вероятно, называется просто «массив объектов» на других языках, таких как C. Под «объектом», я имею в виду структуру, состоящую из различных элементов, то есть только список в R - например:

myObject <- list(title="Uninitialized title", xValues=rep(NA,50), yValues=rep(NA,50)) 

и Теперь я хотел бы сделать 100 таких объектов, и быть в состоянии решать их членов чем-то вроде

for (i in 1:100) {myObject[i]["xValues"]<-rnorm(50)} 

или

for (i in 1:100) {myObject[i]$xValues<-rnorm(50)} 

Я был бы благодарен за любую подсказку о том, где это т hing.

Заранее благодарен!

+1

если все 100 объектов одного типа, то вы можете использовать 'matrix'. Вы можете хранить много разных матриц в одном «списке». т. е. у вас будет «список матриц». Если объекты имеют различный тип, вы можете сохранить их в 'data.frame' или' list', и в этом случае у вас будет «список data.frames' или« список списков ». –

+0

Если размеры всегда будут прямоугольными (в вашем случае 100x50), и содержимое всегда будет однородным (в вашем случае, числовым), тогда создайте ** массив/матрицу **. Если вы хотите добавить/удалить/вставить в отдельные списки (или изменить тип данных), используйте ** список списков **. – smci

ответ

2

Я не знал, что вы искали создание других объектов одинаковой структуры. Вы ищете replicate.

my_fun <- function() { 
    list(x=rnorm(1), y=rnorm(1), z="bla") 
} 
replicate(2, my_fun(), simplify=FALSE) 

# [[1]] 
# [[1]]$x 
# [1] 0.3561663 
# 
# [[1]]$y 
# [1] 0.4795171 
# 
# [[1]]$z 
# [1] "bla" 
# 
# 
# [[2]] 
# [[2]]$x 
# [1] 0.3385942 
# 
# [[2]]$y 
# [1] -2.465932 
# 
# [[2]]$z 
# [1] "bla" 
+0

классный, это еще одно очень хорошее решение (в дополнение к примеру с lapply, упомянутым thelatemail). Большое спасибо! –

+1

@VasilyA - Yep, 'replicate' - это просто обертка вокруг' sapply', которая является кузеном 'lapply'. Чем больше вы знаете ;-) – thelatemail

10

Вы ищете имя этого мифического зверя или просто как это сделать? :) я могу ошибаться, но я думаю, вы бы просто назвать это список списков .. например:

# create one list object 
x <- list(a = 1:3 , b = c(T , F) , d = mtcars) 

# create a second list object 
y <- list(a = c('hi', 'hello') , b = c(T , F) , d = matrix(1:4 , 2 , 2)) 

# store both in a third object 
z <- list(x , y) 

# access x 
z[[ 1 ]] 

# access y 
z[[ 2 ]] 

# access x's 2nd object 
z[[ 1 ]][[ 2 ]] 
+0

Я искал имя, чтобы иметь возможность сделать правильный поисковый запрос - найти место, где он описан, и не тратить время для объяснения этого мне :) –

+0

в вашем примере вы создаете объект, содержащий 2 другие объекты разных типов. Мне нужно иметь 100 объектов одной составной структуры (я не знаю, звучит ли это более ясно ...). –

+0

@VasilyA, я думаю, у вас есть 100 списков ('A1, A2, ..., A100'). Теперь сделайте другой список, выполнив 'B <- list (A1, A2 ... A100') (да, вы должны набрать их). Затем вы можете получить доступ к «B [[1]] [[2]]» для второго элемента первого списка, как показал Энтони. Если это не то, что вы ищете, тогда вам придется отредактировать сообщение, чтобы лучше объяснить. Потому что это то, о чем вы, кажется, просите. – Arun

0

вот пример решения я на данный момент, может быть, это будет полезно для кто-то:

NUM <- 1000 # NUM is how many objects I want to have 
    xVal <- vector(NUM, mode="list") 
    yVal <- vector(NUM, mode="list") 
    title <- vector(NUM, mode="list") 
    for (i in 1:NUM) { 
    xVal[i]<-list(rnorm(50)) 
    yVal[i]<-list(rnorm(50)) 
    title[i]<-list(paste0("This is title for instance #", i)) 
    } 
    myObject <- list(xValues=xVal, yValues=yVal, titles=title) 
    # now I can address any member, as needed: 
    print(myObject$titles[[3]]) 
    print(myObject$xValues[[4]]) 
+1

Возможно, вы можете сделать что-то более простое: 'lapply (1: 10, function (y) list (title = paste (" title # ", y, sep =" "), x = rnorm (50), y = rnorm (50))) 'где' 1: 10' - это число списков, которые вы хотите создать, '1: n'. – thelatemail

+0

@thelatemail, большое спасибо! Это действительно лучше! –

0

Если размеры всегда будут иметь прямоугольную форму (в вашем случае, 100х50), а содержание всегда будет однородным (в вашем случае, числовой), а затем создать 2D массив/матрицы.

Если вы хотите добавить/удалить/вставить в отдельные списки (или изменить тип данных), воспользуйтесь списком .

+1

nope, я имел в виду разнородные, необязательные-прямоугольные объекты. Извините за то, что вы не поняли в моем примере –

+0

@VasilyA: ok, поэтому нажмите кнопку «Изменить» на свой вопрос, чтобы сказать это. Не погребенные здесь в комментариях, которые вряд ли кто-нибудь прочтет. – smci

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