9.2 高频问题
常用的数据操作包含
- 创建空的数据框或者说初始化一个数据框,
- 按指定的列对数据框排序,
- 选择特定的一些列,复杂情况是可能需要正则表达式从列名或者值中筛选
- 合并两个数据框,分为 (inner outer left right) 四种情况
- 宽格式和长格式互相转换,即重塑操作 reshape,单独的 tidyr 包操作,是 reshape2 包的进化版,提供
spread
和gather
两个主要函数
9.2.1 初始化数据框
创建空的数据框,就是不包含任何行、记录
<- data.frame(
empty_df Doubles = double(),
Ints = integer(),
Factors = factor(),
Logicals = logical(),
Characters = character(),
stringsAsFactors = FALSE
)str(empty_df)
## 'data.frame': 0 obs. of 5 variables:
## $ Doubles : num
## $ Ints : int
## $ Factors : Factor w/ 0 levels:
## $ Logicals : logi
## $ Characters: chr
如果数据框 df 包含数据,现在要依据它创建一个空的数据框
= df[FALSE,] empty_df
还可以使用 structure 构造一个数据框,并且我们发现它的效率更高
<- function() structure(list(
s Date = as.Date(character()),
File = character(),
User = character()
),class = "data.frame"
)<- function() data.frame(
d Date = as.Date(character()),
File = character(),
User = character(),
stringsAsFactors = FALSE
)::microbenchmark(s(), d()) microbenchmark
## Unit: microseconds
## expr min lq mean median uq max neval
## s() 26.8 33.85 102.338 45.30 53.20 4742.3 100
## d() 293.5 322.30 422.397 352.15 435.75 2963.9 100
9.2.2 移除缺失记录
只要行中包含缺失值,我们就把这样的行移除出去
complete.cases(airquality), ] |> head() airquality[
## Ozone Solar.R Wind Temp Month Day
## 1 41 190 7.4 67 5 1
## 2 36 118 8.0 72 5 2
## 3 12 149 12.6 74 5 3
## 4 18 313 11.5 62 5 4
## 7 23 299 8.6 65 5 7
## 8 19 99 13.8 59 5 8
9.2.3 数据类型转化
str(PlantGrowth)
## 'data.frame': 30 obs. of 2 variables:
## $ weight: num 4.17 5.58 5.18 6.11 4.5 4.61 5.17 4.53 5.33 5.14 ...
## $ group : Factor w/ 3 levels "ctrl","trt1",..: 1 1 1 1 1 1 1 1 1 1 ...
<- PlantGrowth
bob <- sapply(bob, is.factor)
i <- lapply(bob[i], as.character)
bob[i] str(bob)
## 'data.frame': 30 obs. of 2 variables:
## $ weight: num 4.17 5.58 5.18 6.11 4.5 4.61 5.17 4.53 5.33 5.14 ...
## $ group : chr "ctrl" "ctrl" "ctrl" "ctrl" ...
9.2.4 跨列分组求和
输入是一个数据框 data.frame,按照其中某一变量分组,然后计算任意数量的变量的行和和列和。
空气质量数据集 airquality 按月份 Month 分组,然后求取满足条件的列的和
Reduce(rbind, lapply(unique(airquality$Month), function(gv) {
<- subset(airquality, subset = Month == gv)
subdta data.frame(
Colsum = as.numeric(
colSums(subdta[, grepl("[mM]", names(airquality))], na.rm = TRUE)
),Month = gv
) }))
## Colsum Month
## 1 2032 5
## 2 155 5
## 3 2373 6
## 4 180 6
## 5 2601 7
## 6 217 7
## 7 2603 8
## 8 248 8
## 9 2307 9
## 10 270 9
什么是函数式编程,R 语言环境下的函数式编程是如何操作的