R语言数据结构与数据处理基础内容
5.1向量
r
复制代码
# 数据结构与数据处理
# 5.1向量
# seq创建向量
seq(from = 1, to = 10, by = 1)
# rep创建向量
x <- rep(3, 3)
rep(1:3, 2) #已向量1:3举例,可换做任意向量,下文不在赘述
rep(1:3, each = 2)
#使用索引访问向量
my_vex = 1:3
for(i in 1:length(my_vex)){
print(my_vex[i])
}
my_vex[10] #NA
my_vex[10] = 1; length(my_vex) #长度发生改变
my_vex[c(-1, -2)] #不查看1,2索引的值
#练习:删除1:10向量的后5个数
my_vex = seq(1, 10, 1)
my_vex <- my_vex[-(length(my_vex) - 5 + 1) : -length(my_vex)]
#使用逻辑型访问索引
my_vex[c(T,F)] #注意:向量不够长会循环补齐变为TFTF...所以结果为1 3 5
my_vex[c(T,T,F,F,F)]
#append(my_vex, vec_you_want, after = )函数添加索引
append(my_vex, 1:3, after = 1) #在第一个数字后添加123
#循环补齐,向量向加减等操作如果不够长,便会循环补齐,像上面所示
#向量的比较
c(1, 2, 3) == c(1, 2, 3) # > < >= <= != == 都会逐个元素比较
identical(c(1, 2, 3), c(1, 2, 3) #整体比较
identical(1.1 - 0.2, 0.9)#浮点数比较不能用identical,因为有精度误差
all.equal(1.1 - 0.2, 0.9)#all.equal相当于近似计算相等
v1 <- c(1: 5)
any(v1 > 3? #any 向量中是否有值大于3
all(v1 > 3) #all 向量中是?袢看笥?3
#按条件提取元素 例(选出平方大于5的元素)
# 这只是一种方法,当然也可以if函数+ for遍历
v1 <- -3:3
v1 * v1
v1 * v1 > 5
v2 <- v1[v1*v1 > 5]; v2
5.2矩阵与数组
r
复制代码
#5.2矩阵与数组
#创建矩阵 , 默认列优先
#1.
matrix(1:12, nrow = 3, ncol = 4, byrow = F,
dimnames = list(c("fir", "sec", "thi"), c("fir", "sec", "thi", "fou")))
#2.
y <- 1:12
dim(y) <- c(3, 4)
print(y)
#对角矩阵的创建
x <- 1: 3; diag(x)
x <- rep(1: 3); diag(x)
#矩阵的拼接
mat1 <- rbind(A = 1:3, B = 4:6); mat1 #行拼接
mat2 <- cbind(mat1, c(7, 8), c(9, 10)); mat2 #列拼接
#线性代数的运算
#1 矩阵乘法 %*%
mat1 <- matrix(c(1: 6), nrow = 3); mat1
mat2 <- matrix(c(11:16), nrow = 2); mat2
mat1 %*% mat2
#2 矩阵转置
mat3 <- t(mat1); mat3
#3. 矩阵?哪?
mat3 <- 1:4
dim(mat3) <- c(2, 2)
mat3 <- solve(mat3); mat3
#4. 矩阵的行列式值
det(mat3)
#5. 特征值分解eigen()
mat <- matrix(1: 9, nrow = 3)
eigen(mat)
#使用矩阵索引,读者可随便玩玩,R语言的访问很宽泛
mat1
mat1[,1]
mat1[1,];
mat1[2,2]
mat2
mat2[1,2:3]
# apply函数族
mat <- matrix(1:9, nrow = 3)
apply(mat, 1, sum) #1是按行 2是按列, 最后面的参数是个函数,可以自己写
apply(mat, 2, sum)
f <- function(x){
return (x - 1)
}
mat <- matrix(1:6, 3); mat
f(mat)#观察一下直接调用和下面的apply函数调用的区别
apply(mat, 1, f)
#多维数组
dim1 = c("Tom","Bob")
dim2 = c("math","chemis","phy")
dim3 = c("semes_one", "semes_two")
array(1:12, c(2, 3, 2), dimnames = list(dim1, dim2, dim3))
5.3数据框
r
复制代码
#5.3数据框
#1. 数据框的创建
names <- c("Tom", "Bob","Jerry")
ages <- c(19,18,20)
df <- data.frame(names, ages, stringsAsFactors = F); df #stringsAsFactors = F 是为了防止自动转换为因子,具体见下文
#数据框的合并
#注意:rbind cbind 都不会改变原来的df,只有重新赋值后才可以。
rbind(df, list("Rose", 20)) #添加行,每一行是list,不是vec
cbind(df, weight = c(70, 73, 60))#添加列,每一列是vec,不是list
str(rbind(df, list("Fan","20")))
#merge()函数合并数据框
df1 <- data.frame( name = c("Tom", "Bob","Jerry"), age = c(19,18,20)); df1
df2 <- data.frame( name = c("Bob", "Tom","Jerry"), score = c(90,85,88)); df2
merge(df1, df2, by = "name")
#访问数据框中的元素
df1[2,] #访问第二行
df1[,1] #访问第一列
df1['name'] #访问name列
df1$age #访问age列 $符号可以理解为提取后面的列
#给数据框添加行名
row.names(df1) <- c("stu1", "stu2", "stu3"); df1
#使用sql语句查询数据框
install.packages("sqldf")
library(sqldf)
sqldf("select * from df1 where age > 18")
5.4因子
r
复制代码
#5.4因子
data = c("East", "West", "North", "South", "East", "East", "West")
data_fac <- factor(data); data_fac
levels(data_fac)
as.numeric(data_fac) #以数值类型显示因子,数值是上面levels的索引
data_fac[length(data_fac) + 1] = "East"; data_fac #可以添加已存在的因子水平
data_fac[length(data_fac) + 1] = "center"; data_fac #添加不存在的因子水平会产生NA
summary(data_fac)#因子总结函数 summary()
5.5列表
r
复制代码
#5.5列表
#列表中可以包含多种数据类型
my_list <- list("it's a string of a list", num_vec1 = c(1, 2, 1),
num_vec2 = c(3, 4, 5), df = data.frame(name = c("Tom", "Bob"), age = c(19, 18)),
fun = function(v1, v2){return (v1 + v2)}); my_list
#可以通过索引号或者$符号访问列表中的元素
my_list[[1]] #访问第一个元素. 注意:这里是双中括号
my_list$num_vec1 #访问num_vec1元素
#5.6数据的导入与导出
df <- read.table("C:\\Users\\21136\\OneDrive\\Desktop\\data.txt", header = T) #导入txt文件 要在当前工作目录下 可以用getwd()查看工作目录。 sep是分隔符
#除了read.table 还有read.csv read.csv2等函数,读者可自行查看帮助文档
write.table(df, file = "C:\\Users\\21136\\OneDrive\\Desktop\\data.txt", sep = "\t") #导出txt文件, 会覆盖掉原来的文件
#5.7数据清洗
#排序
v <- c(3, 1, 4, 2)
sort(v) #升序排序
sort(v, decreasing = T) #降序排序
order(v) #返回排序后元素的索引
order(-v) #降序排序后元素的索引
v[order(v)] #等同于sort(v)
df <- data.frame(a = c(5, 2, 2, 2), b = c(2, 5, 4, 9), c = c(75, 435, 43, 735))
df[order(df$a, -df$b), ] #先按a升序,再按b降序排序
#离群点
x <- c(1:10, 20, -8)
boxplot.stats(x)$out #提取离群点
#缺失值NA的处理
x <- c(1, 2, NA, 4, NA, 5)
mean(x) #结果为NA
mean(x, na.rm = T) #去掉NA后计算均值