R语言学习笔记丨因子factor和数据框data frame基础介绍和使用教程

今天的笔记内容是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

本文由mdnice多平台发布

posted @ 2022-09-21 18:11  生信分析笔记  阅读(1222)  评论(0编辑  收藏  举报