R - 数据框是列的列表吗?

时间:2015-12-24 07:00:48

标签: r dataframe

问题

  1. R中的数据框是列的列表(在我的理解中,列表是一系列对象)吗?
  2. R中的设计决策是什么使数据框架成为面向列的(不是面向行的)结构?
  3. 任何对相关设计文档或数据结构设计文章的引用都将不胜感激。
  4. 我只是习惯于作为一个单元/记录行,并想知道为什么它是面向列的。或者,如果我误解了某些内容,请善意提出建议。

    背景

    我原以为数据帧是一系列行,例如(Ozone,Solar.R,Wind,Temp,Month,Day)。

    > c ## data frame created from read.csv()
      Ozone Solar.R Wind Temp Month Day
    1    41     190  7.4   67     5   1
    2    36     118  8.0   72     5   2
    3    12     149 12.6   74     5   3
    4    18     313 11.5   62     5   4
    7    23     299  8.6   65     5   7
    8    19      99 13.8   59     5   8
    
    > typeof(c)
    [1] "list"
    

    但是当对c应用lapply()来显示每个列表元素时,它就是一列。

    > lapply(c, function(arg){ return(arg) })
    $Ozone
    [1] 41 36 12 18 23 19
    $Solar.R
    [1] 190 118 149 313 299  99
    $Wind
    [1]  7.4  8.0 12.6 11.5  8.6 13.8
    $Temp
    [1] 67 72 74 62 65 59
    $Month
    [1] 5 5 5 5 5 5
    $Day
    [1] 1 2 3 4 7 8
    

    虽然我曾预料到

    [1]    41     190  7.4   67     5   1
    [1]    36     118  8.0   72     5   2
    …
    

1 个答案:

答案 0 :(得分:4)

1) R中的数据框是列的列表吗?

是。

df <- data.frame(a=c("the", "quick"), b=c("brown", "fox"), c=1:2)
is.list(df)        # -> TRUE
attr(df, "name")   # -> [1] "a" "b" "c"
df[[1]][2]         # -> "quick"

2) R中的设计决策是什么使数据框架成为面向列(不是面向行)的结构?

data.frame是列向量的列表。

is.atomic(df[[1]])     # -> TRUE
mode(df[[1]])          # -> [1] "character"
mode(df[[3]])          # -> [1] "numeric"

矢量只能存储一种物体。 A&#34;面向行&#34; data.frame将要求数据帧由列表组成。现在想象一下像

这样的操作的性能
df[[1]][20000]

将位于基于列表的数据框中,记住随机访问对于向量是O(1),对于列表是O(n)。

3)任何对相关设计文档或数据结构设计文章的引用都将不胜感激。

http://adv-r.had.co.nz/Data-structures.html#data-frames