2017-02-01 8 views
1

나는이 데이터 프레임에서 중첩 된 목록을 만들 싶습니다 두 가지 요소로 데이터 프레임에서 중첩 목록을 만드는 방법은 무엇입니까?

dat <- data.frame(var1 = c("A", "A", "B", "B"), 
        var2 = c("A_1", "A_2", "B_1", "B_2"), 
        val = 1:4) 

> dat 
    var1 var2 val 
1 A A_1 1 
2 A A_2 2 
3 B B_1 3 
4 B B_2 4 

가 처음 var1에 의해 데이터 프레임을 분할 :

mylist <- split(dat, dat$var1) 
> mylist 
$A 
    var1 var2 val 
1 A A_1 1 
2 A A_2 2 

$B 
    var1 var2 val 
3 B B_1 3 
4 B B_2 4 

가 지금은 VAR2에 대한 중첩 된 목록을 만들려면, 나는 시도 :

mylist <- lapply(mylist, function(x) split(x, x$var2)) 

> mylist 
$A 
$A$A_1 
    var1 var2 val 
1 A A_1 1 

$A$A_2 
    var1 var2 val 
2 A A_2 2 

$A$B_1 
[1] var1 var2 val 
<0 Zeilen> (oder row.names mit Länge 0) 

$A$B_2 
[1] var1 var2 val 
<0 Zeilen> (oder row.names mit Länge 0) 


$B 
$B$A_1 
[1] var1 var2 val 
<0 Zeilen> (oder row.names mit Länge 0) 

$B$A_2 
[1] var1 var2 val 
<0 Zeilen> (oder row.names mit Länge 0) 

$B$B_1 
    var1 var2 val 
3 B B_1 3 

$B$B_2 
    var1 var2 val 
4 B B_2 4 

var1과 var2가 존재하지 않는 빈 데이터 프레임을 어떻게 피할 수 있습니까?

답변

4

droplevels에서 두 번째 인수를 나누기 만하면됩니다. 이렇게하면 원래 data.frame에서 생성 된 외부의 요인 수준을 제거 할 수 있습니다.

lapply(mylist, function(x) split(x, droplevels(x$var2))) 
$A 
$A$A_1 
    var1 var2 val 
1 A A_1 1 

$A$A_2 
    var1 var2 val 
2 A A_2 2 


$B 
$B$B_1 
    var1 var2 val 
3 B B_1 3 

$B$B_2 
    var1 var2 val 
4 B B_2 4 
+0

조합과 함께 훌륭한 옵션입니다. – akrun