基础篇 01

data.frame 与 tibble 的区别和联系

跟上R语言领袖的脚步,领先进入数据科学新的时代

📚
学习提示: 本教程内容仅供学习参考,实际应用时请结合具体数据和场景进行调整。 代码和方法可能需要根据实际情况进行修改。
💡

tibble 是 tidyverse 核心包之一,被定义为取代传统 data.frame 的数据类型。 它在保持与 data.frame 兼容的同时,带来了更友好的打印输出、更严格的子集操作和更智能的类型处理。

1. 创建 tibble

# 加载包
suppressMessages(library(tidyverse))

# 创建 tibble
t1 <- tibble(1:10, b = LETTERS[1:10])
head(t1)

# 创建 data.frame 对比
d1 <- data.frame(1:10, b = LETTERS[1:10])
head(d1)

📌 注意:tibble 输出时会多一行,显示每列的数据类型!

tibble 的 7 种数据类型缩写

int → integer(整数)
dbl → double(双精度浮点)
chr → character(字符串)
dttm → date-time(日期时间)
lgl → logical(逻辑值 TRUE/FALSE)
fctr → factor(因子)
date → date(日期)

2. 类型继承关系

# 查看类型
class(t1)
# [1] "tbl_df"     "tbl"       "data.frame"

str(t1)

class(d1)
# [1] "data.frame"

💡 关键洞察:tibble 是 data.frame 的子类型!这意味着所有针对 data.frame 的函数都可以用于 tibble。

3. 数据类型转换

# data.frame → tibble
d1 <- data.frame(1:5, b = LETTERS[1:5])
d2 <- as_tibble(d1)  # 注意是下划线,不是句点!

# tibble → data.frame
as.data.frame(d2)

⚠️ 常见错误:不要写成 as.tibble(),应该是 as_tibble()(下划线)!

tibble 可以与 data.frame、list、matrix 之间平滑转换,但 不能直接与 vector 转换

4. tibble 数据操作

library(tibble)

df <- tibble(x = 1:3, y = 3:1)

# 添加列
add_column(df, z = -1:1, w = 0)

# 添加行
add_row(df, x = 99, y = 9)

# 在指定位置插入行
add_row(df, x = 99, y = 9, .before = 2)

5. 输出对比

tb <- tibble(
  a = 1:5,
  b = a * 2,
  c = NA,
  d = 'a',
  e = letters[1:5]
)
head(tb)

# tibble 只显示适合屏幕的行数,不会打印大量数据
# 同时显示列的类型信息

💡 优势:当数据量大时,tibble 自动截断输出,避免屏幕被刷屏!

6. data.frame 工具函数

df <- data.frame(x = 1:3, y = 3:1)
row.names(df) <- LETTERS[1:3]

# 检查是否有某列
has_name(df, 'x')

# 检查是否有行名
has_rownames(df)

# 行名转为列
df2 <- rownames_to_column(df, var = "rowname")

# 列转为行名
column_to_rownames(df2, var = "rowname")

这些函数主要用于 data.frame 到 tibble 的转换,因为 tibble 没有行名 的概念。

📝 总结

✅ tibble 优势

  • • 更友好的打印输出
  • • 更严格的子集操作(不部分匹配)
  • • 支持列表列
  • • 与 tidyverse 完美兼容

🔄 兼容性

  • • tibble 是 data.frame 子类
  • • 所有 data.frame 函数可用
  • • 平滑类型转换
  • • 无缝集成现有代码