【问题标题】:Named List To/From Data.Frame命名列表到/从 Data.Frame
【发布时间】:2012-05-13 01:31:12
【问题描述】:

我正在寻找一种在以下格式的列表之间来回切换的快速方法:

$`a`
  [1] 1 2 3
$`b`
  [1] 4 5 6

到/从以下格式的data.frame:

   name x
 1    a 1
 2    a 2
 3    a 3
 4    b 4
 5    b 5
 6    b 6

(在这种情况下,不要真正关心列的名称是什么。)

这是上面使用的 R 格式的数据框:

df <- data.frame(name=c(rep("a",3),rep("b",3)), x=c(1:3,4:6))

再次,我正在寻找两个单独的操作:一个将上述 data.frame 转换为列表,另一个将其转换回 data.frame。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    另一个选项是enframe 来自tibble

    library(tidyverse)
    enframe(lst1) %>%
       unnest
    

    数据

    lst1 <- list(a=1:3, b=4:6)
    

    【讨论】:

      【解决方案2】:

      我希望对@Tyler Rinker 的建议发表不平凡的评论

      X <- split(df$x, df$name)
      

      可以用

      更一般地完成
      X <- split(df, df$name)
      

      @Tyler Rinker 的 split() 解释与 R 食谱相匹配

      http://my.safaribooksonline.com/book/programming/r/9780596809287/6dot1dot-splitting-a-vector-into-groups/id3392005

      指定可以对向量进行分组,而实际上可以对整个数据帧进行分组。我认为对数据框而不是向量进行分组将是更有价值的工具(实际上也是让我写这篇文章的原因)。

      (df <- data.frame(name=c(rep("a",3),rep("b",3), rep("c",3)), x=c(1:3,4:6, 7:9)))
      (X <- split(df, df$name))
      

      HTH。

      【讨论】:

        【解决方案3】:

        可能是这样的:

        X <- split(df$x, df$name)
        data.frame(name = rep(names(X), sapply(X, length)), 
            x=do.call('c', X))
        

        编辑: 我决定将 Andrie 和我的解决方案组合成一个似乎正是 OP 要求的相当简单的解决方案。话虽如此,我不太明白我会以这种方式处理数据而不是 Andrie 如何处理数据的情况,因为数据帧无论如何都是等长向量的列表。

        # Your data set
        df <- data.frame(name=c(rep("a",3),rep("b",3)), x=c(1:3,4:6))
        
        # converting it to list of vectors
        X <- split(df[, 2], df[, 1])
        # converting it to a dataframe
        Y <- stack(X)[, 2:1]; names(Y) <- names(df)
        
        # Take Y and feed it back to these lines to show it 
        # switches back and forth
        (X <- split(Y[, 2], Y[, 1]))
        Y <- stack(X)[, 2:1]; names(Y) <- names(df);Y
        

        【讨论】:

        • +1 我在想也许melt(as.data.frame(...),value.name = 'x',variable.name = 'name') 回到数据框。
        • 应该注意 split 重新排序数据帧,因为它构建了第二个向量的一个因子。另请参阅 Creating a named list from two vectors (names, values) 以获取使用 mapply 的解决方案。
        【解决方案4】:

        在基础 R 中使用 stackunstack

        x <- data.frame(a=1:3, b=4:6)
        
        x
          a b
        1 1 4
        2 2 5
        3 3 6
        

        使用stack 从宽到高,即将矢量堆叠在一起。

        y <- stack(x)
        y
          values ind
        1      1   a
        2      2   a
        3      3   a
        4      4   b
        5      5   b
        6      6   b
        

        使用unstack 进行反向操作。

        unstack(y)
          a b
        1 1 4
        2 2 5
        3 3 6
        

        如果你的数据结构比你描述的更复杂,stackunstack 可能不再适合。在这种情况下,您必须在基础 R 中使用 reshape,或者在包 reshape2 中使用 meltdcast

        【讨论】:

          猜你喜欢
          • 2020-05-22
          • 2015-11-10
          • 1970-01-01
          • 2019-05-30
          • 2015-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多