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