矩阵
定义一个矩阵
在R语言中,有几种定义矩阵的方法。我来为您介绍最常用的几种:使用 matrix() 函数:
1. 使用 `matrix()` 函数:
```{r}
# 基本语法:matrix(data, nrow, ncol, byrow = FALSE)
# 创建一个2行3列的矩阵
matrix1 <- matrix(c(1,2,3,4,5,6), nrow=2, ncol=3)
print(matrix1)
# 按行填充数据 (byrow = TRUE)
matrix2 <- matrix(c(1,2,3,4,5,6), nrow=2, ncol=3, byrow=TRUE)
print(matrix2)
```
2. 使用向量转换:
```{r}
# 将两个向量组合成矩阵
x <- c(1,2,3)
y <- c(4,5,6)
matrix3 <- rbind(x,y) # 按行绑定
print(matrix3)
matrix4 <- cbind(x,y) # 按列绑定
print(matrix4)
```
3. 创建特殊矩阵:
```{r}
# 创建单位矩阵
diag_matrix <- diag(3) # 3x3的单位矩阵
print(diag_matrix)
# 创建全零矩阵
zero_matrix <- matrix(0, nrow=2, ncol=3)
print(zero_matrix)
```
注意事项:
- 矩阵中的所有元素必须是相同的数据类型。
- 默认情况下,矩阵是按列填充的(byrow=FALSE)。
- 可以使用 dim()函数查看矩阵的维度。
- 可以使用rownames()和 colnames()为矩阵的行和列命名。
示例:
```{r}
创建一个带有行名和列名的矩阵
m <- matrix(1:9, nrow=3, ncol=3)
rownames(m) <- c("row1", "row2","row3")
colnames(m) <- c("col1", "col2", "col3")
print(m)
```
矩阵的基本操作
```{r}
# 提取矩阵中的元素
m[1,]# 提取矩阵m中的第1行元素
m[2,2]# 提取矩阵m中的第2行第2列元素
m[1:2,]# 提取矩阵m中的第1行和第2行元素
m[1:2,c(1,3)]# 提取矩阵m中的第1行、第2行、第1列和第3列元素
```
数组
数组的结构特点
- 数组指维数超过2的数据结构类型。
- 向量和矩阵可以看作特殊的数组。
- 和矩阵一样,数组中要求所有数据模式(类型)要一致。
- 数组是按列优先的方式进行数据填充。
创建数组的函数格式如下:\
myarray \<- array(vector, dimensions, dimnames)
```{r}
dim1 <- c("A1", "A2")
dim2 <- c("B1", "B2", "B3")
dim3 <- c("C1", "C2", "C3", "C4")
z1 <- array(1:24, c(2, 3, 4))
z1
```
```{r}
z2 <- array(data=1:24, dim=c(2, 3, 4),dimnames=list(dim1, dim2, dim3))#为行、列和维数(层)命名
z2
```
数组的基本操作
```{r}
z2[1,2,3] # 提取数组中的第3层第1行第2列元素(按行、列、层的顺序,首先选择层)
```
```{r}
# 随着维数的增加,dim向量也会相应的增加。下面的4维数据可以看作是由多个3维数据构成的团块。
dw <- array(data = rep(1:24,times = 3), dim = c(3,4,2,3)) #其中的参数分别指行、列、层和块数。
dw
```
数据框
数据框结构
```{r}
# 使用data.frame()函数创建数据框
#mydata <- data.frame(col1, col2, col3,...)
```
```{r}
patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(patientID, age, diabetes, status)
patientdata
```
```{r}
names(patientdata)#查看列名
```
选取变量(元素):
```{r}
patientdata[1:2]
#注意,patientdata[1:2,]为选取前两行的所有列。
patientdata[1:2,]
patientdata[c("patientID", "age")]
patientdata$age
```
```{r}
#用table()函数产生交联表
table(patientdata$diabetes, patientdata$status)
```
```{r}
#用with()函数概括数据,进行多个操作。
with(mtcars,{
summary(mpg)
plot(mpg,disp)
plot(mpg,wt)
})
```
```{r}
用with()函数概括数据
patientdata <- data.frame(patientID, age, diabetes, status, row.names=patientID)
with(patientdata,{
patient_age <- summary(age)#或用summary(patientdata$age)
patient_age1<<- summary(age)
})
```
```{r}
patient_age1#注意在with()括号外运行patient_age时会报错,需用<<-符号。
#patient_age 显示错误: 找不到对象'patient_age'
```
- 定义行名
```{r}
#指定某个变量名为行名
patientdata <- data.frame(patientID, age, diabetes, status, row.names=patientID)
patientdata
```
```{r}
#自定义行名
patientdata <- data.frame(patientID, age, diabetes, status, row.names=c("a","b","c","d"))
patientdata
```
或用letters\[\]选取小写字母,LETTERS\[\]选取大写字母:
```{r}
patientdata <- data.frame(patientID, age, diabetes, status, row.names=c(LETTERS[1:4]))
patientdata
```
数据框的基本操作
- 用edit()和fix()互动编辑器操作数据
```{r}
#用edit()编辑数据并保存到新对象file1
#file1 <- edit(patientdata)
#file1
```
```{r}
#fix(patientdata)
```
- 显示数据结构信息
```{r}
str(patientdata)
nrow(patientdata)
ncol(patientdata)
```
- 提取数据
```{r}
#提取前两行
patientdata[1:2,]
#提取最后两列
patientdata[,-1:-2]
```
- 添加数据(列)
```{r}
patientdata$sex <- c("男","女","男","女")
patientdata
```
- 删除数据
```{r}
#删除变量
myvars <- names(patientdata) %in% c("sex", "status")
newdata <- patientdata[!myvars]
newdata
```
- 重命名变量名
```{r}
names(patientdata)
```
```{r}
names(patientdata)[2] <- "年龄"
patientdata
```
列表
```{r}
#对列表取子集,和向量的方法一样。向量的子集仍然是向量,使用[]提取列表的子集,总是返回列表。
l <- list(
"one" = c("a", "b", "c"),
"two" = c(1:5),
"three" = c(TRUE, FALSE)
)
l
```
```{r}
l[1]#使用位置索引
l["two"]#也可用元素名索引
```
如果想提取列表某个变量的值,需要使用 \[\[ \]\]或$。
```{r}
l[[1]]
l[["two"]]
l$three
```
注意:[ ] 和[[ ]]的区别,x$y是x\[\["y"\]\]的简写
```{r}
x <- c(3, 5, NA, 2, NA)
# 使用is.na(x)检查向量元素是否为缺失值,并保存为新的对象x_missing
x_missing <- is.na(x)
x_missing
# 将所有缺失值赋值为0
x[is.na(x)] <- 0 # 或者用x <- replace(x, is.na(x), 0)
x
# 然后sum()计算
sum(x)
```

46万+

被折叠的 条评论
为什么被折叠?



