【问题标题】:Appending list to data frame in R将列表附加到R中的数据框
【发布时间】:2012-09-26 06:53:26
【问题描述】:

我在 R 中创建了一个包含两列的空数据框:

d<-data.frame(id=c(), numobs=c())

我想在这个数据框(循环中)附加一个列表,d1,它有输出:

[1] 1  100

我尝试使用rbind

d<-rbind(d, d2)

merge:

d<-merge(d, d2)

我什至尝试制作一个列表列表,然后将其转换为数据框,然后为该数据框命名:

d<-rbind(dlist1, dlist2)
dframe<-data.frame(d)
names(dframe)<-c("id","numobs")

但这些似乎都不符合常规检查器的标准(这是针对一个类),这会给出错误:

Error: all(names(cc) %in% c("id", "nobs")) is not TRUE

即使它在我的工作区中运行良好。

这很令人沮丧,因为错误没有显示错误发生的位置。

谁能帮我合并 2 个数据框或将一个数据框附加到一个列表?

【问题讨论】:

  • data.frames 的名称似乎不匹配。在代码中,第二个名称是numobs,但在错误消息中,第二个名称似乎是nobs。您能否发布一个可重现的最小示例?
  • d2 的结构如何?它是长度为 2 的向量列表吗?

标签: r list dataframe append rbind


【解决方案1】:

d2 对象被打印为原子向量。也许如果您向我们展示 dput(d2) 或 str(d2) 您会对 R 列表有更好的理解。此外,代码的第一位也不会产生两列数据帧。

> d<-data.frame(id=1, numobs=1)[0, ]             # 2-cl dataframe with 0 rows
> dput(d)
structure(list(id = numeric(0), numobs = numeric(0)), .Names = c("id", 
"numobs"), row.names = integer(0), class = "data.frame")
> d2 <- list(id="fifty three", numobs=6)          # names that match names(d)
> rbind(d,d2)
           id numobs
2 fifty three      6

【讨论】:

    【解决方案2】:

    对于初学者来说,例行检查器似乎正在寻找标有“id”和“nobs”的列。如果这与您的文件输出不匹配,您将收到该错误。

    我正在学习可能是同一类的课程并且有同样的错误;更正我的列名使它消失了(我将第二个标记为“nob”而不是“nobs”!)现在我已经让例行检查器正确完成,或者看起来......但它输出了三个数据文件,第一个和最后一个文件是正确的,但第二个文件产生“对不起,这是不正确的”。没有进一步的反馈。令人抓狂!

    在这里发布我的代码没有意义,因为它在所有课程示例中都可以在本地运行,而且当您不知道脚本要求什么时,很难调试。叹息。

    【讨论】:

      【解决方案3】:

      我认为您混淆了rbindmerge 的用途。 rbind 附加 data.frames 或命名列表,或垂直。而merge水平地结合了 data.frames。

      你似乎也被vector's 和list's 搞糊涂了。在 R 中,list 可以为每个元素采用不同的数据类型,而vector 必须让所有元素具有相同的类型。 listvector 都是一维的。当您使用rbind 时,您希望附加一个命名 list不是 一个命名/未命名vector

      未命名的向量和列表

      定义vector 的方式是使用c() 函数。您定义 未命名 列表的方式是使用 list() 函数,如下所示:

      vec1 = c(1, 10)
      # > vec1
      # [1]  1 10
      
      list1 = list(1, 10)
      # > list1
      # [[1]]
      # [1] 1
      # 
      # [[2]]
      # [1] 10
      

      注意vec1list1 都有两个元素,但list1 将这两个数字存储为两个单独的向量(元素[[1]] 向量c(1)[[2]] 向量c(10)

      命名向量和列表

      您还可以创建命名向量和列表。你这样做:

      vec2 = c(id = 1, numobs = 10)
      # > vec2
      # id numobs 
      # 1     10
      
      list2 = list(id = 1, numobs = 10)
      # > list2
      # $id
      # [1] 1
      # 
      # $numobs
      # [1] 10
      

      两者的数据结构相同,但元素已命名。

      数据框作为列表

      注意list2 在每个元素名称前都有一个$。这可能会为您提供一些线索,即data.frame 实际上是list,每列都是list 的元素,因为df$column 通常用于从数据框中提取列。这是有道理的,因为listdata.frame 可以采用不同的数据类型,这与vectors 不同。

      rbind 函数

      当您的第一个元素是数据框时,rbind 要求您附加的内容与数据框的列具有相同的名称。现在,命名 vector 将不起作用,因为 vector 的元素不被视为数据框的列,而命名 list 匹配具有列的元素(如果名称相同):

      演示:

      d<-data.frame(id=c(), numobs=c())
      
      rbind(d, c(1, 10))
      #   X1 X10
      # 1  1  10
      
      rbind(d, c(id = 1, numobs = 10))
      #   X1 X10
      # 1  1  10
      
      rbind(d, list(1, 10))
      #   X1 X10
      # 1  1  10
      
      rbind(d, list(id = 1, numobs = 10))
      #   id numobs
      # 1  1     10
      

      了解以上内容,很明显,您当然也可以rbind 两个列名匹配的数据框:

      df2 = data.frame(id = 1, numobs = 10)
      
      rbind(d, df2)
      #   id numobs
      # 1  1     10
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-08
        • 2021-02-06
        • 2019-10-12
        • 2017-10-17
        • 1970-01-01
        • 2019-04-09
        • 2021-05-01
        相关资源
        最近更新 更多