tags: R 入門 iMooc 數據類型 函數
這是在 imooc 慕課網上聽課做的一點內容。目前看來十分沒有邏輯。感覺上和matlab挺像,但是一些數據類型還是沒有什么概念。
1. 數據類型
查看數據x類型:class(x)
字符(character), 它們常常被引號包圍
邏輯類型(logic),TRUE,FALSE和NA,全部大寫
復數(complex),1+2i
數值型(numeric),可以是整數或者小鼠
整數(integer),在數字后面加上大寫的L
列表(list) S 對象的向量
因子(factor) 常用于標記樣本
1.1邏輯向量
>, <, >=, <=,
不等:!=
相等:==
交集(and):&
并集(or):|
1.2 字符型
字符向量也可以用c()
拼接
1.3 產生序列
- rep(a, times = value),重排。
- seq(from = value, to = value, by = value, length = value). 例如,seq(1,10,2),從1開始,步長為2,到10,結果是[1,3,5,7,9]
2. 數據結構
2.1 向量
2.1.1 產生向量
函數vector有兩個參數:類型(mode)和長度(length),創建的向量中元素值取決于參數所指定的數據類型:數值型向量則元素值都為0,邏輯型都為FALSE,字符型都為""。以下三個函數有幾乎相同的效果(創建一個向量)并且只有一個參數即長度:numeric(),logical(),和character()。
-
vector(mode = 'character', length = 5)
產生一個字符類型的空向量。 -
x1 <- 1:4
產生int向量,[1 2 3 4 ] -
x2 <- c(1,2,3,4)
產生num向量 [1 2 3 4] -
x2 <- c(TRUE,1,'3','a')
產生char向量 ['TRUE','1','3','a'] -
as.character(x)
強制轉換類型 -
names(x) <- c('name1','name2','name3')
添加數據標簽
2.2 矩陣
- 向量+維度
- 先row,再col
-
attribute(x)
查看屬性
2.2.1 產生矩陣
用matrix來創建:matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
選項byrow表示數據給出的值是要按列填充(缺省值)還是按行填充
(如果為TRUE)。可以通過選項dimnames給行列命名。
e = c(1:6)
f = matrix(e,2,3,byrow=TRUE)
f
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
另一種創建矩陣的方法是給維數適當的賦值,這種方法也能改變已有矩陣的維度
> dim(e)
NULL
> dim(e) <- c(2,3)
> e
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
> dim(e) <- c(3,2)
> e
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
2.2.2 矩陣拼接
-
rbind(x,x1)
row拼接(縱向) -
cbind(x,x1)
col拼接(橫向)
2.2.3 矩陣維度的命名
> dimnames(e) <- list(c('1','2','3'), c('a','b'))
> e
a b
1 1 4
2 2 5
3 3 6
2.3 數組
維度可以到達多維(三維及以上)的矩陣,R中的矩陣只能有2維
創建方法是 x <- array(1:24, dim = c(2,3,4))
2.4 列表(list)
可以包含不同類型的對象,通過雙重方括號或者名詞來訪問
l <- list('a', 2.4, TRUE, 4L, -2)
l <- list(x1 = 'a', x2 = 2.4, x3 = TRUE, x4 = 4L, x5 = -2) # 可以命名,通過l[[2]]或l[['x2']]訪問
l <- list(c(1,2,3),c(2,4,5))
2.5 因子
- 處理分類變量。包括順序變量和命名變量。通過在factor函數中添加參數 order = TRUE來構造順序變量。
- 整數變量+標簽(優于整數變量)。常用于線性模型
一個因子不僅包括分類變量本身,還包括變量不同的可能水平(即使它們在數據中不出現)。因子函數factor用下面的選項創建一個因子:
x <- factor(c('male','male','male','female','female'))
x
[1] male male male female female
Levels: female male
y <- factor(c('male','male','male','female','female'), levels = c('male','female') )
y
[1] male male male female female
Levels: male female # 和x相比,順序不同。依次編號
factor(x, levels = sort(unique(x), na.last = TRUE), labels = levels, exclude = NA, ordered = is.ordered(x))`
levels 用來指定因子可能的水平(缺省值是向量x中互異的值);labels用來指定水平的名字;exclude表示從向量x中剔除的水平值;ordered是一個邏輯型選項用來指定因子的水平是否有次序。回想數值型或字符型
對因子進行整體性了解,可以使用table(x)
查看因子不同水平的數量。還可以去掉因子的屬性levels,使用unclass(x),會變成一個integer的向量。
2.6 缺失值
- NA/NaN, NaN 屬于NA,NA不屬于NaN
- NaN一般用于數字缺失值,但是NA更廣。同時NA有類型屬性,如字符型整數型
- 用
is.na()
和is.nan()
判斷是否是缺失值
2.7 數據框 data frame
儲存表格數據。
可以視為各個元素長度相同的列表
- 每個元素代表1列數據(豎著的1列)
- 每個元素的長度代表行數
- 元素類型可以不同
2.7.1 輸入數據框
t <- data.frame(第一列,第二列,...,row.names = ,)
> t <- data.frame(id = c(1,2,3,4),grade = c(70,77,89,90))
> t
id grade
1 1 70
2 2 77
3 3 89
4 4 90
- nrow和ncol可以分辨查看行和列數
- 和矩陣的差別在于,每一列類型可以不同
- 可以用data.matrix()轉化為矩陣
2.8 日期和時間(未完待續)
date(),
用as.date()可以把2016-07-20儲存為date格式。用weekdays()、montths()、quarters()能分別告訴我們哪一天哪一月哪一季度,julian()
如何選出數據集中的某一個?
如果知道名稱name,可以用$name來選出
例如
> x<- data.frame(v1 = 1:3,v2 = c('a','b','c'))
> x
v1 v2
1 1 a
2 2 b
3 3 c
> x$v1
[1] 1 2 3
> x$v1>2
[1] FALSE FALSE TRUE
> x[x$v1>1,]
v1 v2
2 2 b
3 3 c
> x[which(x$v1>1),]
v1 v2
2 2 b
3 3 c
3. apply函數
apply系列函數的基本作用是對數組(array,可以是多維)或者列表(list)按照元素或元素構成的子集合進行迭代,并將當前元素或子集合作為參數調用某個指定函數。vector是一維的array,dataframe可以看作特殊的list。
這些函數間的關系
作用目標 | 在每個元素上應用 | 在子集合上應用 |
---|---|---|
array | apply | tapply |
list | lapply(...) | by |
其中lapply(...)包括一系列函數
lapply
|
| -> 簡化版: sapply
| | -> 可設置返回值模板: vapply
| | -> 多變量版: mapply
|
| -> 遞歸版: rapply
另外vector比較奇怪,vector是一維的array,但是卻不全是和array使用相同的函數。在按元素迭代的情況下,使用和list一樣的lapply函數;而在按子集合迭代的情況下,tapply和by都能用,只是返回值形式不同。
apply
沿著某一維度進行處理
apply(array, margin, FUN, ...)
在array上,沿margin方向,依次調用FUN。返回值為vector。margin表示數組引用的第幾維下標(即array[index1, index2, ...]中的第幾個index),1對應為1表示行,2表示列,c(1,2)表示行列。例如 apply(x,2,sum)對列求和。
lapply
循環處理列表中的每一個元素
lapply(列表,函數/函數名,其他參數)
sapply 和lapply一樣,只是化簡了結果,能用向量就用向量,能用矩陣就用矩陣。
mapply
lapply的多元版本
mapply(函數,數據,參數)以下兩句效果是一樣的
list(rep(1,4),rep(2,3),rep(4,2),rep(4,1))
mapply(rep,1:4,4:1)
tapply
對向量子集進行操作
tapply(向量,因子/因子列表,函數)
tapply(array, indices, margin, FUN=NULL, ...)
按indices中的值分組,把相同值對應下標的array中的元素形成一個集合,應用到FUN。類似于group by indices的操作。如果FUN返回的是一個值,tapply返回vector;若FUN返回多個值,tapply返回list。vector或list的長度和indices中不同值的個數相等。
當FUN為NULL的時候,返回一個長度和array中元素個數相等的vector,指示分組的結果,vector中相等的元素所對應的下標屬于同一組。例如,返回c(1, 2, 1, 3, 2), 表示根據傳入的indices,第1、3個元素作為一組,第2、5個元素作為一組,第4個元素作為一組。
例如
x <- c(1:4,2:5,3:6)
f <- gl(3, 4) #產生因子水平(分組),三個因子每因子5個
tapply(x,f,mean)
3.2排序
sort
order 給出排序后的下標,多個標準
x <- data.frame(v1 = 1:5, v2= 2:6, v3 = 3:7)
x[order(x$v1, x$v2),]
3.3總結數據信息
head
tail
summary
str
table
sum
any
all
xtabs 交叉表