2016-05-24 3 views
3

У меня есть следующий dataframe:R: Преобразование data.frame в список с бирками из data.frame

df0 <- data.frame(N1 = c("A","B") 
       , N2 =c("C","C") 
       , value =c(10,10) 
       ) 
> df0 
    N1 N2 value 
1 A C 10 
2 B C 10 

Я хотел бы преобразовать в список со следующей структурой:

list0 <- list(A= list(C= 10) 
      , B= list(C= 10) 
      ) 
> list0 
$A 
$A$C 
[1] 10 

$B 
$B$C 
[1] 10 

> str(list0) 
List of 2 
$ A:List of 1 
    ..$ C: num 10 
$ B:List of 1 
    ..$ C: num 10 

Любая идея? Моя проблема - получить теги (имена) вместо индексов.

ответ

3

Вы можете использовать apply функцию:

list0 <- setNames(apply(df0, 1, function(row) { 
       a <- list() 
       a[[row[2]]] <- as.numeric(row[3]) 
       return (a) 
       }), df0$N1) 
list0 
$A 
$A$C 
[1] 10 


$B 
$B$C 
[1] 10 


str(list0) 
List of 2 
$ A:List of 1 
    ..$ C: num 10 
$ B:List of 1 
    ..$ C: num 10 
+0

Спасибо. Я пробовал что-то подобное с лапкой, но не получилось. – giordano

+0

Это решение работает с функцией 'apply' вместо' lapply'. – Psidom

+0

Я имел в виду, что попробовал, прежде чем увидел ваше решение. Еще раз спасибо. С вашим решением в качестве шаблона можно построить все виды сложного списка из фреймворка данных. – giordano

2

Попробуйте это:

split(setNames(as.list(df0$value),df0$N2),df0$N1) 
+1

Идентичное решение в другом стиле: загрузить 'magrittr' или' dplyr', а затем 'as.list (df0 $ value)%>% setNames (df0 $ N2)%>% split (df0 $ N1)' –

+0

Спасибо за это решение. – giordano

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