【问题标题】:R - Data Frame is a list of columns?R - 数据框是列的列表?
【发布时间】:2016-03-30 15:42:23
【问题描述】:

问题

  1. R 中的数据框是否是列列表(在我的理解中,列表是对象序列)?
  2. R 中将数据框设为面向列(而非面向行)结构的设计决策是什么?
  3. 任何对相关设计文档或数据结构设计文章的参考将不胜感激。

我只是习惯于以行为单位/记录,并想知道为什么它是面向列的。或者如果我误解了什么,请提出建议。

背景

我曾认为数据框是一系列行,例如 (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"

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

> 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
…

【问题讨论】:

  • 改用apply(c,2, function(arg){ return(arg) })。而c 是一个data.frame(参见class(c))。并且不要使用c 作为变量名。这可能会有所帮助:stat.ethz.ch/pipermail/r-help/2008-August/171535.htmlstackoverflow.com/questions/6258004/…
  • 向量具有单一模式,因此每一行不能是向量。但每一列都可以是一个向量。
  • @Pascal 使用c 作为对象名称的缺点不再适用。
  • @MatthewLundberg 是使用它的好理由吗?
  • 如果你这样做,它曾经会造成麻烦。它现在不会造成不良影响,因此没有理由避免它。

标签: r dataframe


【解决方案1】:

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"

向量只能存储一种对象。 “面向行”的 data.frame 将要求数据帧由列表组成。现在想象一下一个操作的性能是什么样的

df[[1]][20000]

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

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

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

【讨论】:

    猜你喜欢
    • 2012-01-18
    • 2015-04-21
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多