Featured image of post R语言03-数据框与列表

R语言03-数据框与列表

数据框 Dataframe

数据框的创建
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
## 通过向量组构建数据框
name = c('A','B','C')
height = c(171,180,166)
weight = c(60,65,56)
personal_info = data.frame(name,height,weight) # 未进行指定时行名默认与变量名一致,当然也可以修改

## 通过矩阵构建数据框。R中矩阵其实也可以指定行名和列名,在转化呈数据框时仍会保留。如果矩阵没有行名和列名,则在转化为数据框时行名默认为1,2,3,...,而列名为X1,X2,X3,...
mtx = cbind(1:3,4:6,7:9)
as.data.frame(mtx) # 转化为数据框

## 通过csv文件构建数据框。R语言提供了read.csv函数来读取数据
df = read.csv(
    'PATH/TO/SAMPLE.csv',
	fileEncoding = 'UTF-8',
    stringsAsFactors = F, # 不要把字符串转为因子
    header = TRUE, # 默认将csv的第一行元素设置为行名
)

## 查看数据框
head(df) # 查看数据框的前几行,默认为前六行
str(df) # 查看数据框的结构
summary(df) # 查看数据框的描述性统计结果(按列统计)
数据框的基本操作
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 查看数据框的维数
dim(df)

# 查看数据框中的一列或一行
# 提取列有三种方式,使用列编号、列名或者$列名都可提取该列元素,而提取行元素只有前两种方法
# 与矩阵一样,也可以传入向量,对多个行或列进行提取
df[,1] # 第一列
df[,'y'] # 也是第一列
df$y # 还是第一列
df[1,] # 第一行
df['Sample_1',] # 第一行

# 数据框的排序。没有现成的方法,可以用order函数手工排序
df <- df[order(df$y,decreasing=TRUE),]

# 数据框的合并【重要!】
# by参数可以是单独的行名,或者多个行名组成的向量。在内连接时,程序会保留不同数据框中的by参数中所有列名对应的值完全相同的行,并合并。
# all参数设置为TRUE即完全外连接,即保留x和y中所有的条目,并合并by列值完全一样的行。
merge(
    x, y, # 指定要合并的两个数据框
    by = intersect(names(x), names(y)), # 选择保留哪几列,默认是列名取交集
    by.x = by, # 分开指定列名,适用于x和y中列名不同,但含义一致的情况
    by.y = by, # 同上
    all = FALSE, # 是否做完全外连接(取x和y的所有行),默认是FALSE,即内连接
    all.x = all, # 保留x中所有行(左连接),即使在y中找不到匹配也会保留
    all.y = all, # 保留y中所有行(右连接)
    sort = TRUE, # 对合并结果按by变量排序
    suffixes = c(".x",".y"), # 若合并后两个数据框有相同的列名(非by列),则会加上相应的后缀
    no.dups = TRUE, # 避免出现重复的列名
    incomparables = NULL, 
    ...
)

# 修改行名和列名。可以将数值或向量赋值给行名或列名。【不会循环补齐!】
colnames(df) = c('Y',paste('X', 1:9, sep='_'))
rownames(df) = paste('Sample',1:dim(df)[1],sep='_')

# 添加、删除、修改行或列。总体上与矩阵类似
df[3,5] = 1 # 修改某一元素
df$new = 1:dim(df)[1] # 修改一列,若该列名不存在,就添加一列
df <- df[,c(-1,-2)] # 删除第一列和第二列

# 转为矩阵
df <- as.matrix(df)

### 长宽表互相转换
library(reshape2)
# 使用melt将宽表转化为长表
long = melt(
  df,
  id.vars='y', # 保持哪些列不变,其余的列都会分裂成两列variable和value
)
# 使用dcast将长表转为宽表
wide = dcast(
	long,
    y ~ variable,
)
数据框的运算
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
### 数据框的描述性统计
## 虽然数据框和矩阵很相似,但是作用与矩阵的一些函数无法作用于数据框。
## 使用lapply函数可以计算对应的统计量,并返回为列表,sapply则返回向量
lapply(df,mean) # 计算列均值
lapply(df,var) # 计算列方差,自由度为n-1
lapply(df,sd) # 计算列标准差
lapply(df,quantile) # 计算列分位数
sapply(df,function(x)(x-mean(x))/sd(x)) # 按列中心标准化
scale(df) # 按列中心标准化,于sapply结果一致

### 数据框的线性代数运算
t(df) # 转置
## 若要想使用矩阵计算方法,可以使用as.matrix()后再进行计算

列表 List

列表的构建
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 使用list进行列表的构建
a = 1
b = c(1,2,3)
c = matrix(1:100,10,10)
d = data.frame(matrix(1:9,3,3))
e = list(a,b,c,d)
f = list(num=a,vec=b,mtx=c,df=d,li=e)

# 查看列表
str(f)
列表的基本操作
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 提取列表中的元素,使用双方括号提取【重要!不是单括号】
f[[1]] # 提取列表中第一个元素
f[['num']] # 也可以用名称来提取
f$num # 也可以用美元符号+名称来提取

# 提取子列表,使用单方括号提取【重要!单方括号返回的还是列表】
f[1] # 提取第一个元素作为子列表
f[c(1,3)] # 提取第1、3个元素作为子列表

# 添加元素
f[[10]] = c(1,2) # 修改列表的元素,如果列表长度不足,则会添加若干新元素直至长度符合要求
f[['new']] = c(4,5) # 利用索引名称修改或添加元素
welcome to my blog
使用 Hugo 构建
主题 StackJimmy 设计