考虑这个数据框dat。
dat
# x.num x.chr x.fac
# 1 9.1 9.1 9.1
# 2 9.3 9.3 9.3
# 3 9.5 9.5 9.5
# 4 9.7 9.7 9.7
# 5 9.9 9.9 9.9
# 6 10.1 10.1 10.1
# 7 10.3 10.3 10.3
# 8 10.5 10.5 10.5
# 9 10.7 10.7 10.7
# 10 10.9 10.9 10.9
# 11 11.1 11.1 11.1
这些列看起来很相似,但实际上它们并不相似,这可以通过查看 structure 来发现。
str(dat)
# 'data.frame': 21 obs. of 3 variables:
# $ x.num: num 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 10 ...
# $ x.chr: chr "9.1" "9.2" "9.3" "9.4" ...
# $ x.fac: Factor w/ 21 levels "9.4","9.9","9.8",..: 16 13 18 1 21 11 8 3 2 6 ...
数字向量(如x.num)的排序发生在数字上,而字符向量(如x.chr)的排序发生在字母上。
sort(c(10.1, 9.1))
# [1] 9.1 10.1
sort(c("10.1", "9.1"))
# [1] "10.1" "9.1"
minimum 数字向量很简单。
with(dat, min(x.num))
# [1] 9.1
要根据其数值获取字符向量的minimum,您可以使用as.numeric。
with(dat, min(x.chr))
# [1] "10.1"
with(dat, min(as.numeric(x.chr)))
# [1] 9.1
第三种类型是需要额外步骤的因子向量。仅as.numeric 将产生因子的最低水平1,
with(dat, min(x.fac))
# Error in Summary.factor(c(7L, 8L, 9L, 10L, 11L, 1L, 2L, 3L, 4L, 5L, 6L :
# ‘min’ not meaningful for factors
with(dat, min(as.numeric(x.fac)))
# [1] 1
而信息实际上存储在因子levels中。
with(dat, min(as.numeric(levels(x.fac))[x.fac]))
# [1] 9.1
## or
with(dat, min(as.numeric(as.character(x.fac))))
# [1] 9.1
示例数据:
dat <- structure(list(x.num = c(9.1, 9.3, 9.5, 9.7, 9.9, 10.1, 10.3,
10.5, 10.7, 10.9, 11.1), x.chr = c("9.1", "9.3", "9.5", "9.7",
"9.9", "10.1", "10.3", "10.5", "10.7", "10.9", "11.1"), x.fac = structure(c(7L,
8L, 9L, 10L, 11L, 1L, 2L, 3L, 4L, 5L, 6L), .Label = c("10.1",
"10.3", "10.5", "10.7", "10.9", "11.1", "9.1", "9.3", "9.5",
"9.7", "9.9"), class = "factor")), row.names = c(NA, -11L), class = "data.frame")