9.2 高频问题

常用的数据操作包含

  1. 创建空的数据框或者说初始化一个数据框,
  2. 按指定的列对数据框排序,
  3. 选择特定的一些列,复杂情况是可能需要正则表达式从列名或者值中筛选
  4. 合并两个数据框,分为 (inner outer left right) 四种情况
  5. 宽格式和长格式互相转换,即重塑操作 reshape,单独的 tidyr 包操作,是 reshape2 包的进化版,提供 spreadgather 两个主要函数

9.2.1 初始化数据框

创建空的数据框,就是不包含任何行、记录

empty_df <- data.frame(
  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 包含数据,现在要依据它创建一个空的数据框

empty_df = df[FALSE,]

还可以使用 structure 构造一个数据框,并且我们发现它的效率更高

s <- function() structure(list(
    Date = as.Date(character()),
    File = character(),
    User = character()
  ),
  class = "data.frame"
  )
d <- function() data.frame(
    Date = as.Date(character()),
    File = character(),
    User = character(),
    stringsAsFactors = FALSE
  )
microbenchmark::microbenchmark(s(), d())
## 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 移除缺失记录

只要行中包含缺失值,我们就把这样的行移除出去

airquality[complete.cases(airquality), ] |> head()
##   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 ...
bob <- PlantGrowth
i <- sapply(bob, is.factor)
bob[i] <- lapply(bob[i], as.character)
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) {
  subdta <- subset(airquality, subset = Month == gv)
  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 语言环境下的函数式编程是如何操作的