今天的筆記內容是R語言中因子和數據框的基礎介紹和使用方法。更多筆記關注公眾號:生信分析筆記
R語言 因子
因子可以用來存儲不同類別的數據類型,R 語言創建因子使用 factor() 函數,向量作為輸入參數。
factor() 函數語法格式:
factor(x = character(), #向量
levels, #指定各水平值
labels = levels, #水平標籤
exclude = NA, #剔除的字符
ordered = is.ordered(x), #邏輯值,指定是否排序
nmax = NA) #水平的上限
創建因子
按照如下方式能夠創建一個簡單的因子,含有大和小兩個水平。
> x <- c("大", "小", "大")
> yinzi <- factor(x)
> print(yinzi)
[1] 大 小 大
Levels: 大 小
> print(is.factor(yinzi)) # 判斷是不是因子
[1] TRUE
添加水平標籤
首先,設置因子水平(共兩個水平“大”、“小”),具體方式如下:
> # 因子水平標籤
> x <- c("大", "小", "大",levels=c("大","小"))
> yinzi <- factor(x)
> print(yinzi)
levels1 levels2
大 小 大 大 小
Levels: 大 小
使用 labels 參數為每個因子水平添加標籤,labels 參數的字符順序,要和 levels 參數的字符順序保持一致。
> x <- factor(c("大", "小", "大","小","小"),levels=c("大","小"),labels=c("big","small"),ordered=TRUE)
> print(x)
[1] big small big small small
Levels: big < small
- 生成因子水平
使用 gl() 函數來生成因子水平,語法格式如下:
gl( n, #level的個數
k, #每個level的重複次數
length = n*k, #總長度
labels = seq_len(n), #level的值
ordered = FALSE) #是否排好順序
設置3個level,每個level重複4次的因子水平,並輸出它,示例:
> v <- gl(3,4,labels = c("sheng","xin","biji"))
> print(v)
[1] sheng sheng sheng sheng xin xin xin xin
[9] biji biji biji biji
Levels: sheng xin biji
R語言數據框
數據框(Data frame)也就是常説的"表格"。數據框是 R 語言的數據結構,是特殊的二維列表。
- 數據框每一列都有一個唯一的列名,長度都是相等的,同一列的數據類型需要一致,不同列的數據類型可以不一樣。
- 作為數據框變量的向量、因子或矩陣必須具有相同的長度(行數)。
- 數據框每列是一個變量,每行是一個觀測。
- 向量、因子為數據框提供一個變量,如果向量非數值型則會被強制轉換為因子。
R語言中用date.frame()函數來創建,如下:
data.frame(…, #列向量,可以是字符、數值、邏輯值
row.names = NULL, #行名,默認為NULL
check.rows = FALSE, #檢查行名和長度是否一致
check.names = TRUE, #檢查數據框的變量名是否合法
fix.empty.names = TRUE, #設置是否自動命名
stringsAsFactors = TRUE) #字符是否轉化為因子
接下來,通過實例來演示使用方法,創建數據框和獲取數據框信息操作如下:
> table <- data.frame( #創建一個數據框
+ name1 <- c("boy","girl","dog"),
+ year1 <- c("12","16","7"),
+ add1 <- c("school","home","wc")
+ )
> str(table) #獲取數據結構
'data.frame': 3 obs. of 3 variables:
$ name1....c..boy....girl....dog.. : chr "boy" "girl" "dog"
$ year1....c..12....16....7.. : chr "12" "16" "7"
$ add1....c..school....home....wc..: chr "school" "home" "wc"
> print(summary(table)) #summary顯示概要信息
name1....c..boy....girl....dog.. year1....c..12....16....7..
Length:3 Length:3
Class :character Class :character
Mode :character Mode :character
add1....c..school....home....wc..
Length:3
Class :character
Mode :character
-
提取與顯示特定項
> print(data.frame(table$name....c..boy....girl....dog..,table$add....c..school....home....wc..)) data frame with 0 columns and 0 rows > print(2)#提取第二列 > print(table[1:2,]) #提取結果前兩行 name1....c..boy....girl....dog.. year1....c..12....16....7.. 1 boy 12 2 girl 16 add1....c..school....home....wc.. 1 school 2 home
- 添加新的項
> table$work <- c("ren","ren","animal") #添加新列
> table[4,] <- c("5","6","7","8") #添加新行(第4行)
> print(table)
name1....c..boy....girl....dog.. year1....c..12....16....7..
1 boy 12
2 girl 16
3 5 6
add1....c..school....home....wc.. work
1 school ren
2 home ren
3 7 8
- 複製某些項(重複行號法)
print(table[c(1,1:3),]) #把第一行復制一次,採用重複行號的辦法。
name1....c..boy....girl....dog.. year1....c..12....16....7..
1 boy 12
1.1 boy 12
2 girl 16
3 5 6
add1....c..school....home....wc.. work
1 school ren
1.1 school ren
2 home ren
3 7 8
- 批量複製多行(rep函數)
> print(table[rep(1:3,each <- 2),]) #rep函數得出從1到3數列,重複2次。
name1....c..boy....girl....dog.. year1....c..12....16....7..
1 boy 12
2 girl 16
3 5 6
1.1 boy 12
2.1 girl 16
3.1 5 6
add1....c..school....home....wc.. work
1 school ren
2 home ren
3 7 8
1.1 school ren
2.1 home ren
3.1 7 8
-
數據合併操作
> v1 <- c("a","b") > v2 <- c("1","2") > v3 <- c("ok","no") > > out1 <- cbind(v1,v2,v3) #將多個向量合成數據框,默認豎向填充 > print(out1) v1 v2 v3 [1,] "a" "1" "ok" [2,] "b" "2" "no" > > hebing <- rbind(out1,out1) #合併數據框 > print(hebing) v1 v2 v3 [1,] "a" "1" "ok" [2,] "b" "2" "no" [3,] "a" "1" "ok" [4,] "b" "2" "no"
參考資料:
https://www.runoob.com/r