【问题标题】:data.frame rows to list named elementsdata.frame 行列出命名元素
【发布时间】:2016-09-27 09:21:43
【问题描述】:

我有一个包含 2 列的混合类型、向量和数据框的列表。

> my.list
$a
[1] 1

$df1
  key value
1   b     2
2   c     3

$df2
  key value
1   d     4
2   e     5

我想只得到一个向量列表,每个数据框行将成为一个列表元素,列值作为值,列键作为元素名。

所以这个例子中的结果是:

$a
[1] 1

$b
[1] 2

$c
[1] 3

$d
[1] 4

$e
[1] 5

其实我是这样实现的:

my.list <- list(a = 1, 
                df1 = data.frame(key = c("b", "c"), value = 2:3), 
                df2 = data.frame(key = c("d", "e"), value = 4:5))

unlist(lapply(seq_along(my.list), function(i) {
  if (is.data.frame(my.list[[i]])) {
    with(my.list[[i]], as.list(setNames(value, key), all.names = TRUE))
  } else {
    setNames(my.list[i], names(my.list[i]))
  }
}), recursive = FALSE)

但我不太喜欢这种解决方案。你有更聪明的想法来实现这一点吗?谢谢

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以分两步完成R:

    x = do.call(rbind, Filter(is.data.frame, my.list))
    
    c(Filter(Negate(is.data.frame), my.list), as.list(setNames(x$value, x$key)))
    
    $a
    [1] 1
    
    $b
    [1] 2
    
    $c
    [1] 3
    
    $d
    [1] 4
    
    $e
    [1] 5
    

    【讨论】:

    • 谢谢!我不习惯funprog 函数,但这绝对是一个很好的解决方案!
    【解决方案2】:

    一个选项(基于示例)是将melt(从reshape2)转换为'long'格式,转换为data.tablesetDT),将'key'中的NA元素替换为来自'L1'的对应值,以及split基于'key'的'value'。

    library(data.table)
    library(reshape2)
    with(setDT(melt(my.list))[is.na(key), key := L1], split(value, key))
    

    【讨论】:

    • 感谢您的解决方案!我喜欢单线:)
    猜你喜欢
    • 2011-06-22
    • 1970-01-01
    • 2015-11-10
    • 2012-05-13
    • 2015-12-09
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    相关资源
    最近更新 更多