2015-09-01 3 views
1

Я хочу создать список списков из фрейма данных. Я могу сделать это с for цикла:Эффективный способ создания списка списков в R

n <- 5 
df <- data.frame(x = rnorm(n), y = rnorm(n), N = sample(10:50,n)) 

expList <- vector("list", n) 
for (i in 1:n) 
{ 
    expList[[i]]$par$x <- df$x[i] 
    expList[[i]]$par$y <- df$y[i] 
    expList[[i]]$N <- df$N[i] 
    class(expList[[i]]) <- c(class(expList[[i]]), "Experiment") 
} 

Результат должен выглядеть следующим образом:

expList 

[[1]] 
$par 
$par$x 
[1] 2.574112 

$par$y 
[1] -2.33903 


$N 
[1] 36 

attr(,"class") 
[1] "list"  "Experiment" 

[[2]] 
$par 
$par$x 
[1] -0.264593 

$par$y 
[1] 0.5924768 
    ......... 

Ищу эффективный способ создания этого списка (предположим n = 10e7). Что-то вроде этого: expList[1:n]$par$x <- df$x (Я знаю, что это неправильно).

+1

упоминаемые в будущем с помощью & показывая 'set.seed' до, например, сгенерированных данные и' str' для печати результатов с участием структур. –

ответ

2

Map. В сочетании с конструкторской функцией для вашего класса и do.call, это очень кратким и, кажется, в несколько раз быстрее, чем решение в вопросе.

experiment<-function(x,y,N) 
    structure(list(par=list(x=x,y=y),N=N),class="Experiment") 

L<-do.call(Map,c(f=experiment,df)) 
str(L) 
 
List of 5 
$ :List of 2 
    ..$ par:List of 2 
    .. ..$ x: num -0.754 
    .. ..$ y: num -0.768 
    ..$ N : int 27 
    ..- attr(*, "class")= chr "Experiment" 
$ :List of 2 
    ..$ par:List of 2 
    .. ..$ x: num 0.487 
    .. ..$ y: num -1.31 
    ..$ N : int 23 
    ..- attr(*, "class")= chr "Experiment" 
$ :List of 2 
    ..$ par:List of 2 
    .. ..$ x: num -0.653 
    .. ..$ y: num -0.2 
    ..$ N : int 35 
    ..- attr(*, "class")= chr "Experiment" 
$ :List of 2 
    ..$ par:List of 2 
    .. ..$ x: num -0.687 
    .. ..$ y: num -0.441 
    ..$ N : int 17 
    ..- attr(*, "class")= chr "Experiment" 
$ :List of 2 
    ..$ par:List of 2 
    .. ..$ x: num -0.0851 
    .. ..$ y: num -0.665 
    ..$ N : int 24 
    ..- attr(*, "class")= chr "Experiment" 


данных

df<-structure(list(x = c(-0.754391843396212, 0.487237170179346, -0.653098590457105, 
-0.686632907020112, -0.0850559453983232), y = c(-0.767944417138587, 
-1.31042221234913, -0.199621075494168, -0.441313470125542, -0.664834248101919 
), N = c(27L, 23L, 35L, 17L, 24L)), .Names = c("x", "y", "N"), row.names = c(NA, 
-5L), class = "data.frame") 
0

У вас все в порядке со списком каждой строки DF? то есть

for (i in 1:n) { 
    expList[[i]] <- df[i, ] 
} 

Поскольку вы все еще можете получить доступ к этим переменным в каждом списке. Или ваши данные не совпадали (аналогичный формат) в качестве ваших реальных данных?

+0

Я хочу эту специфическую структуру. Я преобразую элементы списка в класс позже. Я соответствующим образом редактирую свой вопрос. – HBat

0
# library(dplyr), otherwise just do lapply(split(df, 1:n), as.list) 
split(df, 1:n) %>% lapply(as.list) 

> str(.Last.value) 
List of 5 
$ 1:List of 3 
    ..$ x: num 0.979 
    ..$ y: num -0.358 
    ..$ N: int 23 
$ 2:List of 3 
    ..$ x: num -0.0297 
    ..$ y: num 0.589 
    ..$ N: int 21 
So on... 

Работают в каждом списке с lapply(function (x) {blah}). Я считаю, что наличие списков 10e7 в R может быть не идеальным.

+0

'expList $ x' и' expList $ y' должны быть 'expList $ par $ x' и' expList $ par $ y'. – HBat

+1

@HBat 'split (df, 1: n)%>% lapply (функция (d) list (N = d $ N, par = list (x = d $ x, y = d $ y)))' – Vlo

0

Попробуйте это решение:

apply(df, 1L, function(x) { 
    result <- as.list(x) 
    class(result) <- c(class(result), "Experiment") 
    result 
}) 
Смежные вопросы