【问题标题】:Create a data frame from list values从列表值创建数据框
【发布时间】:2014-04-02 19:48:26
【问题描述】:

我有以下列表:

peter <- data.frame(year = 1:5, a = rnorm(5), b = rnorm(5))
john <- data.frame(year = 1:5, a = rnorm(5), b = rnorm(5))

myList <- list(peter, john)
names(myList) <- c("peter", "john")

myList

    $peter
    year           a         b
    1      1.01464245 0.2490931
    2      1.38054309 0.8396630
    3     -0.84094830 0.2410526
    4     -0.05567379 0.6369121
    5     -0.66412862 1.5739672

    $john
    year          a          b
    1      0.3060996 -0.4256702
    2      0.7167710 -0.6828029
    3     -0.6896138  0.6577422
    4     -1.7647412 -0.5651756
    5      0.3065734 -0.4860141

如何将myList 转换为以下数据框:

   year student           a          b
1     1   peter  1.01464245  0.2490931
2     2   peter  1.38054309  0.8396630
3     3   peter -0.84094830  0.2410526
4     4   peter -0.05567379  0.6369121
5     5   peter -0.66412862  1.5739672
6     1    john  0.30609964 -0.4256702
7     2    john  0.71677097 -0.6828029
8     3    john -0.68961377  0.6577422
9     4    john -1.76474117 -0.5651756
10    5    john  0.30657340 -0.4860141

非常感谢。

【问题讨论】:

  • set.seed(1492)! :-) #reproducible
  • 你说的很对,但是,我并不真正关心这些价值观。不过谢谢你提醒我:)

标签: r list dataframe


【解决方案1】:
library(plyr)

dat <- ldply(myList)
colnames(dat) <- c("student", "year", "a", "b")

print(dat)
##    student year           a          b
## 1    peter    1  0.03716519  0.8465317
## 2    peter    2 -1.15449127  1.5461944
## 3    peter    3  0.15933780  0.7468312
## 4    peter    4  0.91745104  0.1113958
## 5    peter    5 -0.22924789 -0.5344617
## 6     john    1  0.40790134  0.5886599
## 7     john    2 -0.88635369 -0.3596063
## 8     john    3 -1.16444277  1.1080161
## 9     john    4 -0.19082412  0.1675609
## 10    john    5  1.19066829 -0.8855810

【讨论】:

    【解决方案2】:

    另一种选择(与本的非常相似)

    > df <- do.call(rbind, myList)
    > df <- transform(df, student=sub("\\.[0-9]", "", rownames(df)))[, c("year", "student", "a", "b")]
    > rownames(df)<- NULL
    > df
       year student           a           b
    1     1   peter -0.71040656 -0.04502772
    2     2   peter  0.25688371 -0.78490447
    3     3   peter -0.24669188 -1.66794194
    4     4   peter -0.34754260 -0.38022652
    5     5   peter -0.95161857  0.91899661
    6     1    john -0.57534696  0.30115336
    7     2    john  0.60796432  0.10567619
    8     3    john -1.61788271 -0.64070601
    9     4    john -0.05556197 -0.84970435
    10    5    john  0.51940720 -1.02412879
    

    【讨论】:

    • ??这没有为student 列提供所需的结果?
    • @BenBolker 这是一个复制粘贴错误;)
    【解决方案3】:

    与本的相似,只是有点不同。

    dd <- do.call(rbind, myList)
    cbind(dd[1], student = sub("[.].*", "", rownames(dd)), dd[2:3], row.names = NULL)
    #    year student           a          b
    # 1     1   peter -1.66983899  0.3683629
    # 2     2   peter  0.25391016 -0.4999335
    # 3     3   peter -0.19102468 -0.9344484
    # 4     4   peter  1.72821089 -2.6148841
    # 5     5   peter  0.30320439 -0.2602509
    # 6     1    john -0.02447092 -0.2396401
    # 7     2    john -1.57022813  1.1159078
    # 8     3    john  2.82545689  0.6818537
    # 9     4    john -0.11273218 -1.8000738
    # 10    5    john -1.39706920  0.1647720
    

    2015 年 9 月 16 日更新对我之前的回答的改进:

    f <- function(x, y) cbind(x[1], student = y, x[-1])
    do.call(rbind, Map(f, myList, names(myList), USE.NAMES = FALSE))
    

    【讨论】:

      【解决方案4】:

      有点笨拙,但是:

      peter <- data.frame(year = 1:5, a = rnorm(5), b = rnorm(5))
      john <- data.frame(year = 1:5, a = rnorm(5), b = rnorm(5))
      myList <- list(peter=peter, john=john)
      do.call(rbind,
            mapply(function(student,d) { data.frame(student,d) },
                  names(myList),myList,SIMPLIFY=FALSE))
      
      • 定义一个函数,根据学生姓名和学生信息创建数据框;
      • 将其传递给mapply()(与SIMPLIFY=FALSE)以获取增强数据帧列表;
      • do.call(rbind,...) 组合碎片。

      或者:

      info <- do.call(rbind,myList)
      student <- rep(names(myList),sapply(myList,nrow))
      data.frame(student,info)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-19
        • 2016-02-29
        • 1970-01-01
        • 2020-11-15
        • 2020-02-23
        相关资源
        最近更新 更多