1. 程式人生 > >R語言中的列表和資料框

R語言中的列表和資料框

一、列表

# --列表

#列表是一種特殊的物件集合,跟陣列一樣,他的元素也有序號確定,但是不同點在於可以存在不同型別的元素。
Lst<-list(name="Fred",no.children=3,wife="Lucy",children.ages=c(4,7,9))
# $name
# [1] "Fred"
# 
# $no.children
# [1] 3
# 
# $wife
# [1] "Lucy"
# 
# $children.ages
# [1] 4 7 9

#列表元素可以Lst[[下標]]
Lst[[2]];Lst[[1]]
# [1] 3

Lst[[4]][2]
# [1] 7

#列表不同於向量,下標不能用向量的方式引用
Lst[[1:2]]
# Error in Lst[[1:2]] : 下標出界

#需要注意的是list[下標]的方式也是合法的,但是返回的是資料表型別,最為標準的引用型別是list[[下標]],
#這樣返回的是原資料型別

#列表的修改
#增加元素
Lst$income<-10000
Lst$name<-"Gavin"
Lst$wife<-NULL
Lst
# $name
# [1] "Gavin"
# 
# $no.children
# [1] 3
# 
# $children.ages
# [1] 4 7 9
# 
# $income
# [1] 10000

二、資料框

資料框是R種的一個數據結構,他通常是矩陣形式的資料,但矩陣各列可以是不同型別的,資料框每列是一個變數,沒行是一個觀測值。

但是,資料框又是一種特殊的列表物件,其class屬性為“data.frame”,各列表成員必須是向量(數值型、字元型、邏輯型)、因子、數值型矩陣、列表或者其它資料框。向量、因子成員為資料框提供一個變數,如果向量非數值型會被強型轉換為因子。而矩陣、列表、資料框等必須和資料框具有相同的行數。

#----資料框
df<-data.frame(
  Name=c("Alice", "Becka", "James", "Jeffrey", "John"),
  Sex=c("F", "F", "M", "M", "M"),
  Age=c(13, 13, 12, 13, 12),
  Height=c(56.5, 65.3, 57.3, 62.5, 59.0),
  Weight=c(84.0, 98.0, 83.0, 84.0, 99.5)
)
df
#     Name  Sex  Age Height Weight
# 1   Alice   F  13   56.5   84.0
# 2   Becka   F  13   65.3   98.0
# 3   James   M  12   57.3   83.0
# 4 Jeffrey   M  13   62.5   84.0
# 5    John   M  12   59.0   99.5
class(df)
# [1] "data.frame"

Lst<-list(
  Name=c("Alice", "Becka", "James", "Jeffrey", "John"),
  Sex=c("F", "F", "M", "M", "M"),
  Age=c(13, 13, 12, 13, 12),
  Height=c(56.5, 65.3, 57.3, 62.5, 59.0),
  Weight=c(84.0, 98.0, 83.0, 84.0, 99.5)
)
Lst
# $Name
# [1] "Alice"   "Becka"   "James"   "Jeffrey" "John"   
# $Sex
# [1] "F" "F" "M" "M" "M"
# $Age
# [1] 13 13 12 13 12
# $Height
# [1] 56.5 65.3 57.3 62.5 59.0
# $Weight
# [1] 84.0 98.0 83.0 84.0 99.5

class(Lst)
# [1] "list"

as.data.frame(Lst)
#     Name Sex Age Height Weight
# 1   Alice   F  13   56.5   84.0
# 2   Becka   F  13   65.3   98.0
# 3   James   M  12   57.3   83.0
# 4 Jeffrey   M  13   62.5   84.0
# 5    John   M  12   59.0   99.5

#矩陣也可以轉換為資料框,如果之前有列名就用之前的列名,沒有的話系統會自動起一個
a<-array(1:6,dim=c(2,3))
a
#       [,1] [,2] [,3]
# [1,]    1    3    5
# [2,]    2    4    6
as.data.frame(a)
#   V1 V2 V3
# 1  1  3  5
# 2  2  4  6

#--資料框的引用,直接用下標、列名來引用資料框
df[1:3,3:4]
#   Age Height
# 1  13   56.5
# 2  13   65.3
# 3  12   57.3

df[["Name"]]
# [1] Alice   Becka   James   Jeffrey John   
# Levels: Alice Becka James Jeffrey John   #很明顯轉化為了factor型別

df$Name
# [1] Alice   Becka   James   Jeffrey John   
# Levels: Alice Becka James Jeffrey John

names(df)

rownames(df)<-c("one","two","three","four","five")
df
#           Name Sex Age Height Weight
# one     Alice   F  13   56.5   84.0
# two     Becka   F  13   65.3   98.0
# three   James   M  12   57.3   83.0
# four  Jeffrey   M  13   62.5   84.0
# five     John   M  12   59.0   99.5


#在每次引用df中的屬性時,我們都要加上$,為了避免這種麻煩,我們採用attch函式
attach(df)
Name  #這樣就能直接引用df中的變量了
# [1] Alice   Becka   James   Jeffrey John   
# Levels: Alice Becka James Jeffrey John
detach(df)
Name
# 錯誤: 找不到物件'Name'