2017-08-15 81 views
1

我想用特定格式(前面的最小示例)轉換列表中的數據幀。 對於下面的數據框,我想最後列出5個元素,每個元素都有一個由5個元素組成的列表。將data.frame/tibble以分組方式轉換爲列表

parameters = tidyr::expand(tibble(id=1:5, value = 1:5 * 2),id,value) 

# A tibble: 6 x 2 
    id value 
    <int> <dbl> 
1  1  2 
2  1  4 
3  1  6 
4  1  8 
5  1 10 
6  2  2 

result = base::split(parameters, list(parameters$id)) 
result = lapply(result, function(x) { x["id"] <- NULL; x }) 

到目前爲止,它獲得了id權(5個元素),但不是它們中的子元素。它給出了第一個元素

> a[1] 
$`1` 
# A tibble: 5 x 1 
    value 
    <dbl> 
1  2 
2  4 
3  6 
4  8 
5 10 

,而我希望把它作爲

> as.list(a$`1`$value) 
[[1]] 
[1] 2 

[[2]] 
[1] 4 

[[3]] 
[1] 6 

[[4]] 
[1] 8 

[[5]] 
[1] 10 

這樣的結果看起來是這樣的

[1] 
    [[1]] 
    [1] 2 

    [[2]] 
    [1] 4 

    [[3]] 
    [1] 6 

    [[4]] 
    [1] 8 

    [[5]] 
    [1] 10 
[2] 
    [[1]] 
    [1] 2 

    [[2]] 
    [1] 4 

    [[3]] 
    [1] 6 

    [[4]] 
    [1] 8 

    [[5]] 
    [1] 10 

是否有任何優雅的方式爲了達成這個?

+1

注意,'結果=基地::分(參數$值,列表(參數的$ id))'使第二'lapply'線不必要。 – lmo

+0

感謝您的提示! – MaHo

回答

4

as.listlapply應該做你想要什麼:

lapply(with(parameters, split(value, id)), as.list) 

$`1` 
$`1`[[1]] 
[1] 2 

$`1`[[2]] 
[1] 4 

$`1`[[3]] 
[1] 6 

$`1`[[4]] 
[1] 8 

$`1`[[5]] 
[1] 10 


$`2` 
$`2`[[1]] 
[1] 2 

$`2`[[2]] 
[1] 4 

$`2`[[3]] 
[1] 6 

$`2`[[4]] 
[1] 8 

$`2`[[5]] 
[1] 10