R语言数据处理与日期时间操作全解析
立即解锁
发布时间: 2025-08-22 01:44:47 阅读量: 2 订阅数: 5 


R语言数据处理与清洗指南
### R语言数据处理与日期时间操作全解析
#### 1. 列表和数据框操作
在处理列表和数据框时,我们常常需要对列表的每个元素或数据框的每一行、每一列进行操作。例如,我们可能想知道每列中有多少缺失值。
`apply()` 函数可用于矩阵,但不能用于列表(因为列表没有维度)。对于数据框,`apply()` 会先将其转换为矩阵,只有当所有列类型相同时,这种转换才有意义,否则结果可能出乎意料。
```R
# 创建数据框
dd <- data.frame (a = c(TRUE, FALSE), b = c(1, 123), cc = c("a", "b"), stringsAsFactors = FALSE)
# 使用 apply 函数
apply (dd, 1, function (x) x)
```
上述代码中,由于数据框 `dd` 有字符列,`apply()` 将整个数据框转换为字符矩阵。
`sapply()` 和 `lapply()` 是更通用的操作函数。`lapply()` 总是返回列表,而 `sapply()` 会尝试将输出转换为向量或矩阵。
```R
# 使用 sapply 返回数据框各列的类
sapply (mydf2, class)
```
当对数据框的行进行操作时,`apply()` 可能会失败,而 `sapply()` 和 `lapply()` 能提供解决方案。
```R
# 使用 sapply 识别包含数字 1 的行
sapply (1:2, function (i) any (dd[i,] == 1))
```
#### 2. 拆分、应用、合并策略
`apply()` 函数家族遵循 “拆分 - 应用 - 合并” 策略。`tapply()` 函数可对向量执行此操作,我们也可以通过 `split()` 和 `sapply()` 或 `lapply()` 显式实现。
```R
# 创建数据框
age <- data.frame (Age = c(35, 37, 56, 24, 72, 65), Spouse = c(34, 33, 49, 28, 70, 66), Gender = c("F", "M", "F", "M", "F", "F"))
# 按性别拆分年龄列
split (age$Age, age$Gender)
# 计算各性别年龄的平均值
sapply (split (age$Age, age$Gender), mean)
```
`split()` 还可对数据框进行操作,生成数据框列表,然后我们可以对每个数据框应用函数。
```R
# 按性别拆分数据框
split (age, age$Gender)
# 对拆分后的数据框应用 summary 函数
lapply (split (age, age$Gender), summary)
```
#### 3. 全数值数据框
全数值数据框(列均为逻辑或数值类型)在转换为矩阵时能保留列的数值性质,也可进行转置或使用矩阵下标访问。
R 提供了 `as.matrix()` 和 `as.data.frame()` 函数用于数据框和矩阵之间的转换。
#### 4. 便捷函数
为提高代码可读性,我们鼓励使用长名称的对象和列名,但这可能导致代码冗长。`with()` 和 `within()` 函数可简化操作。
```R
# 使用 with 函数进行计算
with (CustPayment2016, JanDebt + FebPurch - FebPmt)
# 使用 within 函数添加新列
CustPayment2016 <- within (CustPayment2016, FebDebt <- JanDebt + FebPurch - FebPmt)
```
`subset()` 和 `transform()` 函数可帮助我们更轻松地进行子集提取和转换操作,但使用时需注意,它们更适合交互式使用。
```R
# 使用 subset 函数提取子集
subset(d, Price > 0)
# 使用 transform 函数进行转换
transform(d, new_col = col1 + col2)
```
`magrittr` 包中的 `%>%` 函数提供了 “管道” 功能,使代码更易读。
```R
# 使用管道符号进行计算
(8 - 3) %>% sqrt %>% log %>% cos
```
#### 5. 数据框的重新排序、去重和采样
数据框可使用 `order()` 函数进行重新排序。
```R
# 按 ID 和 Date 对数据框排序
ord <- with(cust, order (ID, Date))
cust <- cust[ord,]
```
`unique()` 函数可返回数据框的非重复行,`duplicated()` 可返回逻辑向量,指示哪些行是重复的。
```R
# 去除数据框的重复行
unique(mydf)
```
对于大数据集,可使用 `sample()` 函数进行随机采样。
```R
# 从数据框中采样 200 行
sam <- sample(nrow(mydf), 200)
mydf[sam,]
```
#### 6. 日期和时间对象
在数据清洗中,日期和时间处理是常见需求。我们需要进行日期算术运算,提取日期的日、周几、月、季度或年等信息。
##### 6.1 日期格式化
R 中最简单的日期类是 `Date`,`as.Date()` 函数可将文本转换为 `Date` 对象。
```R
# 将整数转换为 Date 对象
dvec <- as.Date (c(0, 17250:17252), origin = "1970-01-01")
# 使用格式字符串将文本转换为 Date 对象
as.Date (c("Feb 29, 2016",
```
0
0
复制全文
相关推荐










