R语言获取数据
一、手动输入数据
1. 数据编辑器(Edit 方式)
函数 :edit() 或 data.entry()
案例代码:
r
# 创建一个空的数据框
my_data <- data.frame()
# 打开数据编辑器手动输入数据(Windows/Linux GUI环境中有效)
# 注意:在RStudio中可能不弹出编辑器窗口,建议使用R原生环境
my_edited_data <- edit(my_data)
print(my_edited_data)
# 使用 data.entry() 函数(功能类似)
# data.entry(my_data)
# 在现代RStudio中,推荐使用以下方式
# 创建一个带有列名的空数据框
student_data <- data.frame(
name = character(),
age = numeric(),
score = numeric(),
stringsAsFactors = FALSE
)
# 使用 fix() 函数直接编辑
# fix(student_data) # 会弹出编辑器窗口
2. 在代码中直接输入数据
常用函数 :c()、data.frame()、matrix()、list()
案例代码:
r
# 使用 c() 函数创建向量
# 创建学生成绩向量
student_scores <- c(85, 92, 78, 88, 96)
print(student_scores)
# 使用 data.frame() 创建数据框
# 创建学生信息数据框
students <- data.frame(
name = c("张三", "李四", "王五", "赵六"), # 姓名列
age = c(20, 21, 19, 22), # 年龄列
score = c(85, 92, 78, 88), # 成绩列
stringsAsFactors = FALSE # 不转换为因子
)
print(students)
# 使用 matrix() 创建矩阵
# 创建3行2列的矩阵,按列填充
my_matrix <- matrix(
data = 1:6, # 数据:1到6
nrow = 3, # 3行
ncol = 2, # 2列
byrow = FALSE, # 按列填充
dimnames = list( # 行列名称
c("行1", "行2", "行3"),
c("列A", "列B")
)
)
print(my_matrix)
# 使用 list() 创建列表
# 可以包含不同类型的数据
my_list <- list(
name = "数据分析",
data = c(10, 20, 30),
matrix = matrix(1:4, 2, 2),
flag = TRUE
)
print(my_list)
二、读取外部数据
1. 读取文本文件、CSV文件
1.1 读取CSV文件
主要函数 :read.csv()、read.table()
案例代码:
r
# 方式1:使用 read.csv() 读取CSV文件
# 参数说明:
# - file: 文件路径
# - header: 是否将第一行作为列名
# - sep: 分隔符(CSV默认逗号)
# - stringsAsFactors: 是否将字符转为因子
# - na.strings: 指定缺失值的表示方式
# - encoding: 文件编码
# 读取CSV文件的基本用法
csv_data <- read.csv(
file = "data.csv", # 文件名或路径
header = TRUE, # 第一行作为列名
stringsAsFactors = FALSE, # 不转换字符为因子
na.strings = c("NA", "", "NULL"), # 缺失值标记
encoding = "UTF-8" # 文件编码
)
print(head(csv_data)) # 查看前6行
# 方式2:使用 read.table() 读取各种文本文件
# 适用性更广,可以指定不同的分隔符
table_data <- read.table(
file = "data.txt", # 文件名
header = TRUE, # 是否有表头
sep = "\t", # 制表符分隔
quote = "\"", # 引用符号
dec = ".", # 小数点符号
row.names = 1, # 指定第1列为行名
skip = 0, # 跳过前0行
nrows = 100 # 只读取100行
)
# 读取无表头的文件
no_header_data <- read.csv(
"data_no_header.csv",
header = FALSE, # 无表头
col.names = c("col1", "col2", "col3") # 手动指定列名
)
# 处理大文件时的优化选项
large_data <- read.csv(
"large_file.csv",
nrows = 1000, # 只读前1000行进行测试
colClasses = c("numeric", "character", "Date"), # 指定列类型加快速度
comment.char = "#" # 跳过注释行
)
# 读取网络上的CSV文件
url_data <- read.csv(
"https://people.sc.fsu.edu/~jburkardt/data/csv/hw_200.csv"
)
print(head(url_data))
1.2 读取文本文件
案例代码:
r
# 读取普通文本文件(每行为一个字符串)
# 使用 readLines() 函数
text_lines <- readLines(
con = "data.txt", # 文件路径
n = -1, # 读取所有行(-1表示全部)
encoding = "UTF-8" # 编码
)
print(text_lines[1:5]) # 显示前5行
# 读取固定宽度格式的文件
# 使用 read.fwf() 函数
fwf_data <- read.fwf(
file = "fixed_width.txt",
widths = c(10, 8, 5), # 每列的宽度
col.names = c("ID", "Name", "Score"),
header = FALSE
)
print(fwf_data)
# 写入CSV文件示例(用于后续读取测试)
# 创建示例数据
sample_data <- data.frame(
ID = 1:5,
Name = c("A", "B", "C", "D", "E"),
Score = c(85, 92, 78, 88, 96)
)
# 写入CSV文件
write.csv(sample_data, "sample_output.csv", row.names = FALSE)
2. 读取Excel文件
需要的包 :readxl、openxlsx、xlsx
安装和加载:
r
# 安装包(如未安装)
# install.packages("readxl")
# install.packages("openxlsx")
# install.packages("xlsx")
# 加载包
library(readxl)
library(openxlsx)
案例代码(使用 readxl):
r
# readxl 包的特点:不需要Java环境,速度快,最常用
# 1. 查看Excel文件中的所有工作表名称
sheet_names <- excel_sheets("data.xlsx")
print(sheet_names)
# 2. 读取Excel文件(默认第一个工作表)
excel_data <- read_excel(
path = "data.xlsx", # 文件路径
sheet = 1, # 可以是位置(1)或名称("Sheet1")
col_names = TRUE, # 第一行作为列名
skip = 0, # 跳过的行数
n_max = Inf, # 读取的最大行数
na = c("", "NA", "NULL") # 缺失值标记
)
print(head(excel_data))
# 3. 读取指定的工作表
sheet2_data <- read_excel("data.xlsx", sheet = "Sheet2")
# 4. 指定列类型读取
# 使用col_types参数指定每列的类型
typed_data <- read_excel(
"data.xlsx",
col_types = c("text", "numeric", "date", "skip") # skip表示跳过该列
)
# 5. 读取指定范围
range_data <- read_excel(
"data.xlsx",
range = "A1:E100", # 只读取A1到E100区域
sheet = "Sheet1"
)
# 6. 处理大型Excel文件(逐块读取)
# 定义块大小
chunk_size <- 1000
# 计算总行数(需要先快速扫描)
# total_rows <- length(read_excel("large.xlsx", range = cell_rows(1)))
# 分块读取示例(实际使用时取消注释)
# for(i in seq(1, total_rows, chunk_size)) {
# chunk <- read_excel("large.xlsx", range = cell_rows(c(i, i+chunk_size-1)))
# # 处理每个块
# }
案例代码(使用 openxlsx):
r
library(openxlsx)
# 1. 读取Excel文件
ox_data <- read.xlsx(
xlsxFile = "data.xlsx", # 文件路径
sheet = 1, # 工作表索引或名称
startRow = 1, # 开始行
colNames = TRUE, # 是否包含列名
rowNames = FALSE, # 是否包含行名
detectDates = TRUE # 自动检测日期
)
# 2. 读取所有工作表
all_sheets <- getSheetNames("data.xlsx")
all_data <- list()
for(sheet_name in all_sheets) {
all_data[[sheet_name]] <- read.xlsx("data.xlsx", sheet = sheet_name)
}
# 3. 读取指定行列范围
range_ox_data <- read.xlsx(
"data.xlsx",
rows = c(1, 100), # 1到100行
cols = c(1, 5) # 1到5列
)
3. 读取SPSS文件
需要的包 :haven、foreign
案例代码:
r
# 安装并加载haven包(推荐,更新、更好用)
# install.packages("haven")
library(haven)
# 1. 读取SPSS文件(.sav格式)
spss_data <- read_sav(
file = "data.sav", # SPSS文件路径
user_na = FALSE # 是否处理用户定义的缺失值
)
print(head(spss_data))
# 2. 查看数据信息
print(str(spss_data)) # 查看数据结构
print(attributes(spss_data)) # 查看属性(包括标签)
# 3. 提取变量标签
var_labels <- lapply(spss_data, function(x) attr(x, "label"))
print(var_labels)
# 4. 使用foreign包读取(备选方法)
library(foreign)
spss_data_foreign <- read.spss(
file = "data.sav",
use.value.labels = TRUE, # 使用值标签
to.data.frame = TRUE # 直接返回数据框
)
# 5. 读取压缩的SPSS文件(.zsav格式,需要haven 2.0+)
# spss_zdata <- read_sav("data.zsav")
# 6. 处理中文编码问题
# 如果遇到编码问题,先设置区域
# Sys.setlocale("LC_CTYPE", "chinese")
# spss_data_cn <- read_sav("chinese_data.sav")
4. 读取Stata文件
需要的包 :haven
案例代码:
r
library(haven)
# 1. 读取Stata文件(.dta格式)
stata_data <- read_dta(
file = "data.dta" # Stata文件路径
)
print(head(stata_data))
# 2. 读取Stata 13及以后版本的文件
stata13_data <- read_dta("data13.dta")
# 3. 读取时指定编码
stata_cn_data <- read_dta(
"chinese_data.dta",
encoding = "UTF-8" # 指定编码
)
# 4. 查看变量标签
var_labels <- lapply(stata_data, function(x) attr(x, "label"))
print("变量标签:")
print(var_labels)
# 5. 保留值标签信息
# haven会自动导入值标签作为factor类型
# 查看因子变量的水平
if(is.factor(stata_data$some_var)) {
print(levels(stata_data$some_var))
}
# 6. 使用foreign包作为备选
library(foreign)
stata_foreign <- read.dta(
"data.dta",
convert.dates = TRUE, # 转换日期
convert.factors = TRUE # 转换因子
)
5. 读取SAS文件
需要的包 :haven、sas7bdat
案例代码:
r
library(haven)
# 1. 使用haven读取SAS文件(.sas7bdat格式)
sas_data <- read_sas(
file = "data.sas7bdat" # SAS数据集文件
)
print(head(sas_data))
# 2. 读取SAS目录中的多个文件
# sas_catalog <- read_sas("catalog.sas7bcat") # 较少使用
# 3. 使用sas7bdat包(备选)
# install.packages("sas7bdat")
library(sas7bdat)
sas_data_alt <- read.sas7bdat(
"data.sas7bdat",
debug = FALSE, # 是否显示调试信息
col.names = TRUE # 是否读取列名
)
# 4. 处理SAS格式文件中的缺失值
sas_data <- read_sas("data.sas7bdat")
# SAS中的特殊缺失值(.a, .b等)会被转换为NA
# 5. 查看SAS数据集的元数据
print(names(sas_data)) # 变量名
print(dim(sas_data)) # 维度
print(sapply(sas_data, class)) # 各列类型
6. 导入数据库中的数据
需要的包 :RSQLite、RMySQL、RODBC、DBI
案例代码(SQLite):
r
# 安装并加载包
# install.packages("RSQLite")
# install.packages("DBI")
library(RSQLite)
library(DBI)
# 1. 连接到SQLite数据库
# 创建数据库连接(如果文件不存在会自动创建)
con <- dbConnect(
drv = SQLite(), # 驱动
dbname = "my_database.sqlite" # 数据库文件
)
# 2. 写入示例数据到数据库
# 创建示例数据框
sample_df <- data.frame(
id = 1:10,
name = paste0("Person", 1:10),
age = round(runif(10, 18, 60)),
score = round(runif(10, 60, 100))
)
# 将数据框写入数据库表
dbWriteTable(con, "students", sample_df, overwrite = TRUE)
# 3. 查看数据库中的所有表
tables <- dbListTables(con)
print(tables)
# 4. 执行SQL查询
# 方式1:使用dbGetQuery(返回数据框)
query_result <- dbGetQuery(
conn = con,
statement = "SELECT * FROM students WHERE age > 25"
)
print(query_result)
# 方式2:使用dbSendQuery(处理大量数据)
rs <- dbSendQuery(con, "SELECT * FROM students")
# 分批获取数据
chunk <- dbFetch(rs, n = 5) # 获取5行
print("第一批5行:")
print(chunk)
chunk2 <- dbFetch(rs, n = 5) # 再获取5行
print("第二批5行:")
print(chunk2)
# 清空结果集
dbClearResult(rs)
# 5. 参数化查询(防止SQL注入)
# 使用参数占位符
sql <- "SELECT * FROM students WHERE age > ?"
params <- list(30)
safe_query <- dbGetQuery(con, sql, params = params)
print("年龄大于30的学生:")
print(safe_query)
# 6. 执行其他SQL操作
# 创建表
dbExecute(con, "
CREATE TABLE IF NOT EXISTS courses (
course_id INTEGER PRIMARY KEY,
course_name TEXT,
credit INTEGER
)
")
# 插入数据
dbExecute(con,
"INSERT INTO courses (course_name, credit) VALUES (?, ?)",
params = list("数学", 3)
)
# 7. 关闭数据库连接
dbDisconnect(con)
案例代码(MySQL):
r
# 安装并加载RMySQL
# install.packages("RMySQL")
library(RMySQL)
library(DBI)
# 1. 连接到MySQL数据库
# 方法1:使用dbConnect
mysql_con <- dbConnect(
drv = MySQL(),
host = "localhost", # 服务器地址
port = 3306, # 端口号
user = "your_username", # 用户名
password = "your_password", # 密码
dbname = "your_database" # 数据库名
)
# 方法2:使用RMariaDB(现代替代方案)
# install.packages("RMariaDB")
# library(RMariaDB)
# 2. 执行查询
mysql_data <- dbGetQuery(mysql_con, "SELECT * FROM your_table LIMIT 100")
print(head(mysql_data))
# 3. 写入数据到MySQL
dbWriteTable(mysql_con, "new_table", sample_df, overwrite = TRUE)
# 4. 关闭连接
dbDisconnect(mysql_con)
# 注意:实际使用时需要替换为真实的数据库连接信息
案例代码(使用RODBC连接各种数据库):
r
# 安装并加载RODBC
# install.packages("RODBC")
library(RODBC)
# 1. 连接到ODBC数据源(Windows)
# con <- odbcConnect("DSN_Name", uid="user", pwd="password")
# 2. 直接连接Access数据库(示例)
# access_con <- odbcConnectAccess("database.accdb")
# 3. 执行查询
# data <- sqlQuery(con, "SELECT * FROM table")
# 4. 关闭连接
# odbcClose(con)
# 注意:ODBC连接需要预先配置数据源
7. 读取XML文件
需要的包 :XML、xml2
案例代码(使用XML包):
r
# 安装并加载XML包
# install.packages("XML")
library(XML)
# 1. 解析XML文件
xml_doc <- xmlParse(
file = "data.xml", # XML文件路径
encoding = "UTF-8" # 编码
)
# 2. 获取根节点
root_node <- xmlRoot(xml_doc)
print(root_node)
# 3. 提取特定节点
# 使用XPath表达式
nodes <- getNodeSet(
doc = xml_doc,
path = "//record" # XPath: 查找所有record节点
)
# 4. 将XML转换为数据框
# 方法1:使用xmlToDataFrame
xml_df <- xmlToDataFrame(
doc = "data.xml",
stringsAsFactors = FALSE
)
print(head(xml_df))
# 方法2:手动解析
# 假设XML结构:
# <root>
# <person>
# <name>张三</name>
# <age>25</age>
# </person>
# </root>
# 提取所有person节点
person_nodes <- getNodeSet(xml_doc, "//person")
# 创建空数据框
person_data <- data.frame(
name = character(),
age = numeric(),
stringsAsFactors = FALSE
)
# 遍历节点提取数据
for(node in person_nodes) {
name <- xmlValue(node[["name"]]) # 提取name节点文本
age <- as.numeric(xmlValue(node[["age"]])) # 提取age节点文本
# 添加到数据框
person_data <- rbind(person_data,
data.frame(name = name, age = age))
}
print(person_data)
# 5. 解析XML属性
# 假设XML: <person id="001">...
nodes_with_attrs <- getNodeSet(xml_doc, "//person")
for(node in nodes_with_attrs) {
# 获取属性
id <- xmlGetAttr(node, "id")
print(paste("ID:", id))
}
# 6. 处理命名空间
# xml_doc <- xmlParse("ns_data.xml")
# namespaces <- c(ns = "http://example.com/ns")
# nodes <- getNodeSet(xml_doc, "//ns:element", namespaces = namespaces)
# 7. 从XML字符串解析
xml_string <- '<?xml version="1.0"?>
<data>
<item value="1">第一项</item>
<item value="2">第二项</item>
</data>'
xml_from_str <- xmlParse(xml_string, asText = TRUE)
print(xml_from_str)
案例代码(使用xml2包):
r
# 安装并加载xml2包(更现代,更易用)
# install.packages("xml2")
library(xml2)
library(magrittr) # 使用管道操作符
# 1. 读取XML文件
xml_data <- read_xml("data.xml")
# 2. 使用管道操作查询节点
# 查找所有record节点
records <- xml_data %>%
xml_find_all("//record")
# 3. 提取节点文本和属性
record_info <- lapply(records, function(record) {
# 提取子节点文本
name <- record %>%
xml_find_first(".//name") %>%
xml_text()
# 提取属性
id <- record %>%
xml_attr("id")
# 返回列表
list(id = id, name = name)
})
# 4. 转换为数据框
library(purrr)
record_df <- map_df(record_info, ~as.data.frame(.))
print(record_df)
# 5. 处理HTML文件(网页)
# html_data <- read_html("https://example.com")
# titles <- html_data %>% xml_find_all("//h1") %>% xml_text()
三、R语言自带的数据集
数据集介绍
查看所有可用数据集:
r
# 查看R自带的所有数据集
data()
# 查看已加载的数据集
data(package = .packages(all.available = TRUE))
# 查看特定包的数据集
library(datasets)
data(package = "datasets")
mtcars数据集(经典示例)
mtcars数据集详细分析:
r
# 1. 加载mtcars数据集
data(mtcars)
# 2. 查看数据集基本信息
# 查看前6行
head(mtcars)
# 查看后6行
tail(mtcars)
# 查看数据结构
str(mtcars)
# 查看摘要统计
summary(mtcars)
# 3. mtcars数据集说明
# mtcars包含32款汽车的11个指标:
# - mpg: 每加仑英里数(油耗)
# - cyl: 气缸数
# - disp: 排量(立方英寸)
# - hp: 马力
# - drat: 后桥比
# - wt: 重量(1000磅)
# - qsec: 1/4英里时间
# - vs: 发动机形状(0 = V型,1 = 直列)
# - am: 变速器(0 = 自动,1 = 手动)
# - gear: 前进档数
# - carb: 化油器数
# 4. 数据探索示例
# 查看变量名
names(mtcars)
# 查看维度
dim(mtcars)
# 查看列数
ncol(mtcars)
# 查看行数
nrow(mtcars)
# 5. 基本统计分析
# 计算平均油耗
mean_mpg <- mean(mtcars$mpg)
print(paste("平均油耗(英里/加仑):", round(mean_mpg, 2)))
# 按气缸分组统计
library(dplyr) # 加载dplyr包进行数据操作
mpg_by_cyl <- mtcars %>%
group_by(cyl) %>%
summarise(
count = n(),
avg_mpg = mean(mpg),
avg_hp = mean(hp)
)
print(mpg_by_cyl)
# 手动和自动挡对比
am_comparison <- aggregate(
mpg ~ am,
data = mtcars,
FUN = mean
)
print(am_comparison)
# 6. 数据可视化示例
# 绘制油耗与马力的散点图
plot(
x = mtcars$hp,
y = mtcars$mpg,
main = "油耗与马力关系图", # 标题
xlab = "马力", # X轴标签
ylab = "油耗(英里/加仑)", # Y轴标签
pch = 19, # 点的类型
col = "blue" # 点的颜色
)
# 添加趋势线
abline(
lm(mpg ~ hp, data = mtcars), # 线性回归线
col = "red", # 线的颜色
lwd = 2 # 线宽
)
# 7. 导出mtcars数据
# 导出为CSV
write.csv(mtcars, "mtcars.csv", row.names = TRUE)
# 导出为R数据文件
save(mtcars, file = "mtcars.RData")
# 8. 其他常用内置数据集
# iris - 鸢尾花数据集(分类问题经典数据)
data(iris)
head(iris)
# AirPassengers - 航空乘客数(时间序列)
data(AirPassengers)
head(AirPassengers)
# cars - 汽车速度与刹车距离
data(cars)
head(cars)
# pressure - 气压与温度
data(pressure)
head(pressure)
# 9. 数据集使用技巧
# 懒加载数据集(不占用内存)
datasets::mtcars
# 查看数据集帮助文档
?mtcars
?iris
?AirPassengers
四、综合案例:完整的数据获取流程
案例1:从多个来源整合数据
r
# 加载所需包
library(readxl)
library(haven)
library(dplyr)
# 1. 从CSV读取销售数据
sales_data <- read.csv(
"sales_data.csv",
stringsAsFactors = FALSE,
fileEncoding = "UTF-8"
)
print(paste("销售数据行数:", nrow(sales_data)))
# 2. 从Excel读取产品信息
product_info <- read_excel(
"product_info.xlsx",
sheet = "Products"
)
print(paste("产品信息行数:", nrow(product_info)))
# 3. 从SPSS读取客户信息
customer_data <- read_sav("customer_data.sav")
print(paste("客户数据行数:", nrow(customer_data)))
# 4. 合并数据
# 将销售数据与产品信息合并
sales_with_product <- sales_data %>%
left_join(product_info, by = "product_id")
# 将客户信息加入
final_data <- sales_with_product %>%
left_join(customer_data, by = "customer_id")
print("最终合并后的数据维度:")
print(dim(final_data))
# 5. 保存合并后的数据
write.csv(final_data, "integrated_data.csv", row.names = FALSE)
save(final_data, file = "integrated_data.RData")
案例2:模拟数据生成(用于测试)
r
# 创建模拟数据集进行测试
set.seed(123) # 设置随机种子,确保结果可重现
# 1. 生成客户数据
customers <- data.frame(
customer_id = 1:1000,
name = paste0("Customer", 1:1000),
age = round(runif(1000, 18, 80)),
city = sample(c("北京", "上海", "广州", "深圳"), 1000, replace = TRUE),
income = round(runif(1000, 3000, 30000))
)
# 2. 生成产品数据
products <- data.frame(
product_id = 1:50,
product_name = paste0("Product", LETTERS[1:50]),
price = round(runif(50, 10, 1000), 2)
)
# 3. 生成销售记录
sales <- data.frame(
transaction_id = 1:5000,
customer_id = sample(1:1000, 5000, replace = TRUE),
product_id = sample(1:50, 5000, replace = TRUE),
quantity = sample(1:5, 5000, replace = TRUE),
date = sample(seq(as.Date("2023-01-01"), as.Date("2023-12-31"), by = "day"), 5000, replace = TRUE)
)
# 4. 添加计算字段
sales$amount <- sales$quantity * products$price[sales$product_id]
# 5. 保存模拟数据
write.csv(customers, "sim_customers.csv", row.names = FALSE)
write.csv(products, "sim_products.csv", row.names = FALSE)
write.csv(sales, "sim_sales.csv", row.names = FALSE)
print("模拟数据生成完成!")
五、要点回顾
| 知识点 | 主要函数 | 适用场景 | 注意事项 |
|---|---|---|---|
| 手动输入 | c(), data.frame(), matrix() |
小规模测试数据 | 注意数据类型一致 |
| CSV文件 | read.csv(), write.csv() |
通用数据交换格式 | 注意编码和分隔符 |
| 文本文件 | read.table(), readLines() |
非结构化文本 | 指定正确的分隔符 |
| Excel文件 | read_excel(), read.xlsx() |
办公软件数据 | 需安装readxl包 |
| SPSS文件 | read_sav() |
社会科学数据 | 使用haven包 |
| Stata文件 | read_dta() |
计量经济学数据 | 版本兼容性 |
| SAS文件 | read_sas() |
大型数据集 | 需要足够内存 |
| 数据库 | dbConnect(), dbGetQuery() |
大规模数据 | 注意连接管理 |
| XML文件 | xmlParse(), read_xml() |
网页数据、配置文件 | 学习XPath语法 |
| 内置数据 | data() |
学习和测试 | 查看帮助文档 |
数据读取最佳实践:
- 先查看数据结构 :使用
str(),head(),summary() - 处理缺失值 :使用
na.omit(),complete.cases() - 注意数据类型 :使用
as.numeric(),as.Date()转换 - 编码问题 :设置
encoding = "UTF-8" - 大文件处理 :使用
nrows参数或分块读取 - 路径管理 :使用
setwd()或相对路径