我只是习惯将行作为一个单位/记录,并且想知道为什么它是面向列的。或者,如果我误解了一点,请提出。
我以为数据帧是一系列的行,例如(臭氧,Solar.R,风,温度,月,日)。
> 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"
Run Code Online (Sandbox Code Playgroud)
但是,当对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
Run Code Online (Sandbox Code Playgroud)
我原以为是
[1] 41 190 7.4 67 5 1
[1] 36 118 8.0 72 5 2
…
Run Code Online (Sandbox Code Playgroud)
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"
Run Code Online (Sandbox Code Playgroud)
2)在R中将数据帧做成面向列(而不是面向行)的结构的设计决定是什么?
data.frame是列向量的列表。
is.atomic(df[[1]]) # -> TRUE
mode(df[[1]]) # -> [1] "character"
mode(df[[3]]) # -> [1] "numeric"
Run Code Online (Sandbox Code Playgroud)
向量只能存储一种对象。“面向行”的data.frame将要求数据帧由列表组成。现在想象一下操作的性能如何
df[[1]][20000]
Run Code Online (Sandbox Code Playgroud)
请注意,基于随机访问的向量为O(1),列表的为O(n),请注意基于列表的数据帧。
3)任何对相关设计文档或数据结构设计文章的引用将不胜感激。
http://adv-r.had.co.nz/Data-structures.html#data-frames