1. 创建数据框并进行操作
创建数据框
data <- data.frame(
patientID = 1:5,
age = c(25, 34, 28, 52, 40),
diabetes = c("Type1", "Type2", "Type1", "Type1", "Type2"),
status = c("Poor", "Improved", "Excellent", "Poor", "Improved")
)
将diabetes列转换为因子
data$diabetes <- factor(data$diabetes)
为status列设置顺序因子
data$status <- factor(data$status, levels = c("Poor", "Improved", "Excellent"),
ordered = TRUE)
打印数据框
print(data)
2.使用matrix()函数创建一个4x3的矩阵
matrix_data <- matrix(1:12, nrow = 4, ncol = 3, byrow = TRUE, dimnames =
list(c("r1", "r2", "r3", "r4"), c("c1", "c2", "c3")))
打印矩阵
print(matrix_data)
访问矩阵第二行第三列的元素
element <- matrix_data["r2", "c3"]
print(element)
打印矩阵的第二列
print(matrix_data[, "c2"])
向量vs因子
3. 列表的创建与操作
创建一个列表
list_data <- list(
ages = c(21, 22, 23),
m = matrix(1:4, nrow = 2, ncol = 2),
names = c("John", "Doe", "Smith")
)
打印整个列表
print(list_data)
打印列表中的ages
print(list_data$ages)
更新ages为25, 26, 27, 并打印列表
list_data$ages <- c(25, 26, 27)
print(list_data)
列表vs向量
with的使用
在R语言中,with()
函数是一种方便的工具,用于在执行函数时指定一个数据框(data frame)作为操作的环境。这可以减少代码的冗余,使得在对数据框的列进行操作时不必重复地引用数据框的名称。下面是 with()
函数的一些主要用途和优点:
简化代码:
- 当你需要对数据框中的多个列进行操作时,
with()
允许你在不重复数据框名称的情况下执行函数。
- 当你需要对数据框中的多个列进行操作时,
提高可读性:
- 对于不熟悉数据框列名的读者来说,
with()
可以使得代码更加清晰易懂,因为它将数据框的上下文明确地展示出来。
- 对于不熟悉数据框列名的读者来说,
避免作用域问题:
- 在某些情况下,尤其是在编写函数或嵌套函数时,
with()
可以帮助避免变量作用域的问题。
- 在某些情况下,尤其是在编写函数或嵌套函数时,
临时环境:
with()
可以创建一个临时的环境,在这个环境中执行函数,这有助于避免对全局环境的潜在影响。
与
summary()
和plot()
等函数结合使用:with()
经常与summary()
和plot()
等函数结合使用,以便快速获取数据的摘要统计信息或绘制图形。
数据子集操作:
- 当你想要对数据框的子集执行操作,但又不想创建一个新的子集时,
with()
可以提供一种解决方案。
- 当你想要对数据框的子集执行操作,但又不想创建一个新的子集时,
代码封装:
- 在编写包或模块时,
with()
可以用来封装数据操作,使得函数更加通用。
- 在编写包或模块时,
下面是一个使用 with()
函数的例子:
r
with(mtcars, {
summary(mpg) # 打印mpg列的摘要统计信息
plot(mpg, disp) # 绘制mpg与disp的散点图
})
在这个例子中,with()
函数允许我们在不重复 mtcars
数据框名称的情况下,对 mpg
和 disp
列进行操作。
尽管 with()
函数有很多优点,但它也有缺点,比如可能会隐藏变量的作用域,导致代码难以调试。因此,一些R程序员建议谨慎使用 with()
,尤其是在大型项目中。在许多情况下,使用管道操作符(如 %>%
来自 dplyr
或 magrittr
包)可以提供更清晰和更易于维护的代码。
4.factor的操作
您提供的R代码用于创建一个因子(factor),并设置其级别(levels)和顺序(ordered)。下面是您代码的解释和执行结果的描述:
创建一个字符向量并转换为因子:
status <- c("Poor", "Improved", "Excellent", "Poor", "Improved")
:这行代码创建了一个名为status
的字符向量,包含五个元素。status <- factor(status)
:这行代码将字符向量status
转换为因子。在这一步,因子的级别将默认按照它们在向量中出现的顺序排列。
打印因子的级别:
print(levels(status))
:这行代码打印因子status
的级别。在没有指定levels
参数的情况下,级别将按照它们在原始向量中出现的顺序排列。
重新定义因子的级别并设置为有序:
status <- factor(status, levels = c("Poor", "Improved", "Excellent"), ordered = TRUE)
:这行代码重新定义了因子status
的级别,并设置ordered = TRUE
,使得因子成为有序因子。这意味着级别将按照指定的顺序排列,并且可以进行有序比较。
打印有序因子:
print(status)
:这行代码打印重新定义级别后的有序因子status
。
如果您在R环境中运行这段代码,您将得到如下输出:
打印因子的级别(在重新定义之前):
[1] "Poor" "Improved" "Excellent"
打印有序因子(在重新定义级别之后):
[1] Poor Improved Excellent Poor Improved
Levels: Poor < Improved < Excellent
在第二个输出中,您可以看到因子的级别现在被明确标记为有序的,并且按照 "Poor" < "Improved" < "Excellent" 的顺序排列。这在进行统计分析时非常有用,因为有序因子允许您对类别之间的顺序关系进行建模和测试。
attach的使用
首先创建了一个数据框(data frame),然后向其中添加了一列,接着使用 attach()
函数将数据框附加到R的搜索路径中,使得可以不使用数据框的名称来访问其列,最后使用 detach()
函数将数据框从搜索路径中分离。下面是您代码的详细解释:
创建数据框:
df <- data.frame(Name=c("John","Doe","Smith"), Age=c(25,30,28), Gender=c("Male","Female","Male"))
:这行代码创建了一个名为df
的数据框,包含三列:Name
(名字)、Age
(年龄)和Gender
(性别)。
向数据框添加列:
df$Height <- c(170, 165, 180)
:这行代码向df
数据框添加了一列Height
(身高),包含三个数值。
附加数据框:
attach(df)
:这行代码将数据框df
附加到R的搜索路径中。附加后,你可以直接使用列名(如Age
)来访问数据,而不需要使用数据框的名称(如df$Age
)。
打印列:
print(Age)
:由于数据框已经被附加,这行代码直接打印Age
列的内容,而不是df$Age
。
分离数据框:
detach(df)
:这行代码将数据框df
从搜索路径中分离,恢复到原始状态,即访问数据框的列需要使用数据框的名称。
如果您在R环境中运行这段代码,您将看到如下输出:
[1] 25 30 28
这表示 Age
列的内容被成功打印。
请注意,虽然 attach()
函数可以方便地访问数据框的列,但它通常不推荐使用,因为它可能导致命名冲突和代码的可读性降低。在现代R编程实践中,更倾向于使用 $
或 [[
操作符来明确地引用数据框的列,以提高代码的清晰度和可维护性。
使用[ ]索引访问
在R语言中,使用 []
方括号进行索引时,其行为取决于你提供的索引类型:
当使用单个数字索引时:
df[1]
默认提取数据框df
的第一列。
当使用多个数字索引时:
df[1:2]
默认提取数据框df
的第一列和第二列。这里的1:2
是一个数字序列,表示你想要提取的列的索引。
当使用负数索引时:
df[-1]
会提取除了第一列之外的所有列。
当使用行索引时:
df[1, ]
提取数据框df
的第一行,而列索引默认为所有列(即不指定列索引时,默认为1:ncol(df)
)。
当同时使用行和列索引时:
df[1:2, 1:2]
提取数据框df
的前两行和前两列。
当使用逻辑索引时:
df[TRUE, ]
或df[FALSE, ]
可以用于基于条件的行筛选,其中TRUE
表示选择行,FALSE
表示排除行。
当使用字符索引时:
df[c("Name", "Age")]
提取数据框df
中名为 "Name" 和 "Age" 的列。