R语言数据类型2:Vectors向量的创建与基本规则
1.向量类型
- 整数型(integer)
- 字符型(包含字符串)(character and string)
- 逻辑型(logical)
- 双精度型(double)
- two rare types: complex and raw
2.创建向量
- 将值组合为向量或列表:
c(...)
所有参数都被强制转换为共同的类型,这是返回值的类型,并且除了名称之外的所有属性都被移除。
a <- c(1, 2, 5, 3, 6, -2, 4) #整数型
b <- c("one", "two", "three") #字符型
c <- c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE)#逻辑型
d <- c(1, 2.5, 4.5)#双精度型
- 确定向量的类型:
typeof()
- 确定向量的长度:
length()
typeof(a)
typeof(b)
typeof(c)
typeof(d)
‘double’
‘character’
‘logical’
‘double’
3.缺失值的概念(Missing values)
R用特殊哨兵值NA
(不适用,简称not applicable)表示缺失或未知值。
is.na()
:检测缺失值的存在
4.强制类型转换(coercion)
单个向量:所有元素必须是相同类型。
当组合不同类型时,R按照以下强制转换优先级自动统一类型:
character (字符) > complex (复数) > double (浮点) > integer (整数) > logical (逻辑)
e <- c("a",1) # 整数 → 字符
f <- c(TRUE, 10) # 逻辑型 → 数值型
g <- c(3.14, 5L) # 整数 → 浮点型
e
f
g
- 'a'
- '1'
- 1
- 10
- 3.14
- 5
手动进行类型强制转换:as.()
as.logical(c(0, 1, 2, -5, 3.14))# (所有非零为真)
as.integer(c(TRUE, FALSE))
as.double(c(TRUE, FALSE,2))
as.character(c(1:3, pi, 1/0, -1/0))
- FALSE
- TRUE
- TRUE
- TRUE
- TRUE
- 1
- 0
- 1
- 0
- 2
- '1'
- '2'
- '3'
- '3.14159265358979'
- 'Inf'
- '-Inf'
as.logical()
:转换为逻辑值
转换规则:
- 数值/字符 → 逻辑值(TRUE/FALSE)
- 非零数字 → TRUE
- 0 → FALSE
- 特定字符:“true”/“TRUE” → TRUE,“false”/“FALSE” → FALSE
- 其他情况 → NA(带警告)
as.integer()
:转换为整数值
转换规则:
- 浮点数 → 截断小数部分
- 字符 → 必须为纯整数格式
- 非数字字符 → NA(带警告)
as.double()
/ as.numeric()
:转换为浮点数
转换规则:
- 整数字符串 → 转为浮点数
- 科学计数法 → 正常解析
- 非数字 → NA(带警告)
as.character()
:转换为字符串
转换规则:
- 所有类型 → 转为字符表示
- 日期 → ISO格式字符串
- 因子 → 因子标签(本质是字符串存储)
- 永不产生NA(所有类型都可字符串化)
5.访问向量中的元素
v <- c("a", "b", "c", "d", "e")
# 单个元素访问
v[1] # 第一个元素 → "a"
v[3] # 第三个元素 → "c"
# 多个不连续元素
v[c(1, 3, 5)] # → c("a", "c", "e")
# 连续元素范围
v[2:4] # → c("b", "c", "d")
# 负索引(排除元素)
v[-1] # → c("b", "c", "d", "e") (排除第一个)
v[-c(2,4)] # → c("a", "c", "e") (排除第二和第四个)
‘a’
‘c’
- 'a'
- 'c'
- 'e'
- 'b'
- 'c'
- 'd'
- 'b'
- 'c'
- 'd'
- 'e'
- 'a'
- 'c'
- 'e'
v <- c(10, 20, 30, 40, 50)
# 条件过滤
v[v > 25] # → c(30, 40, 50) (值大于25的元素)
v[v %% 3 == 0] # → 30 (能被3整除的元素)
# 手动指定逻辑向量
logical_idx <- c(TRUE, FALSE, TRUE, FALSE, TRUE)
v[logical_idx] # → c(10, 30, 50)
- 30
- 40
- 50
30
- 10
- 30
- 50