实验一 R 语言数据结构、数据导入与数据处理
实验二 基本数据处理
实验三 数据可视化
实验四 数据分析
实验五 综合应用
实验数据下载
1. hospital-data 数据集
数据是关于一些医院的基础信息,数据包含13个字段,包含的字段分别为:供应商编号、医院名、地址 1、地址2、地址3、所处城市、所处州、邮编、所处乡镇、电话、医院类型、医院所有权和是否提供急救服务。数据信息如下:
Provider Number | 供应商编号 | Hospital Name | 医院名 | Address 1 | 地址1 |
Address 2 | 地址2 | Address 3 | 地址3 | City | 所处城市 |
State | 所处州 | ZIP Code | 邮编 | County | 所处乡镇 |
Phone Number | 电话 | Hospital Type | 医院类型 | Hospital Ownership | 医院所有权 |
Emergency Services | 是否提供急救服务 |
2. death rate 数据集
选取人类死亡率数据库(HMD,2007),提供了 1951-2005 年瑞典人口信息。这是个多变量的数据集,变量描述如下表:
Year | 年份 | Age | 年龄 |
Female_Exp | 女性生存人口数 | Male_Exp | 男性生存人口数 |
q_female | 女性死亡率 | q_male | 男性死亡率 |
Female_death | 女性死亡人数 | Male_death | 男性死亡人数 |
L_female_exp | 对数女性生存人口数 | L_male_exp | 对数男性生存人口数 |
3. outcome-of-care-measures 数据集
该数据是记录超过4000家医院关于心脏病、心力衰竭、肺炎的30天内的死亡率和重入院率。(这份数据变量解释,可参照Hospital_Revised_Flatfiles.pdf中的 Outcome of Care Measures.csv 的变量请参考第 17 页编号 19),数据信息如下:
Provider Number | 供应商编号 | Hospital Name | 医院名 |
Address 1 | 地址1 | Address 2 | 地址2 |
Address 3 | 地址3 | City | 所处城市 |
State | 所处州 | ZIP Code | 邮编 |
County | 所处乡镇 | Phone Number | 电话 |
Hospital 30-Day Death (Mortality) Rates from Heart Attack | 医院心脏病发作30天死亡率-列出各医院的风险调整率(百分比) | Comparison to U.S. Rate - Hospital 30-Day Death (Mortality) Rates from Heart Attack | 与美国死亡率的比较-心脏病发作的医院30天死亡率-列出医院所属的死亡率和再入院类别。数值为:优于美国全国平均值、与美国全国平均值无差异、低于美国全国平均值、病例数量太少 |
Lower Mortality Estimate - Hospital 30-Day Death (Mortality) Rates from Heart Attack | 较低的死亡率估计-心脏病发作的医院30天死亡率-列出各医院风险调整率的下限(区间估计) | Upper Mortality Estimate - Hospital 30-Day Death (Mortality) Rates from Heart Attack | 死亡率上限估计-心脏病发作的医院30天死亡率-列出各医院风险调整率的上限(区间估计) |
Number of Patients - Hospital 30-Day Death (Mortality) Rates from Heart Attack | 患者人数-因心脏病发作住院30天死亡率-列出医院治疗心脏病发作的医疗保险患者人数 | Footnote - Hospital 30-Day Death (Mortality) Rates from Heart Attack | 脚注-心脏病发作的医院30天死亡率-列出与医院护理的心脏病发作结果相关的适当脚注值 |
Heart Failure | 心力衰竭 | Pneumonia | 肺炎 |
提示:以下是本篇文章正文内容
在数据被组织成合适的形式后,开始使用图形探索数据,而下一步通常就是使用数值描述每个变量的分布,接下来则是两两探索所选择变量之间的关系。
通过读取文件 outcome-of-care-measures.csv 获取数据保存到 care_df 中,通过写一个名为 best 的函数,找到一个州中最好的医院,函数有两个参数,一个是有两个字母缩写的州名称,另一个是结果名称,包括(heart attack, heart failure, pneumonia),函数的返回结果为 30 天死亡率最低的医院名称。在处理排名的时候,如果出现死亡率相等的情况,将医院按照字母表顺序排序,取第一家医院。
自定义函数:best <- function(state, outcome){}。函数检查输入变量的有效性,如果输入一个无效的州名,函数停止程序,并提示”invalid state”,同样当输入的 outcome 参数有误时,提示”invalid outcome”
函数检验:best(“TX”, “heart failure”);best(“MD”, “heart attack”);best(“MD”, “pneumonia”);best(“BB”, “heart attack”);best(“NY”, “hert attack”)
1.通过读取“hospital-data.csv”将数据保存到df中,获取该数据的条数;查看数据中的前 5 条数据。
# 读取数据
df <- read.csv("R\\data\\ex4\\hospital-data.csv")
# 获取该数据的条数
nrow(df)
## [1] 4826
# 查看数据中的前5条数据
head(df, n = 5)
2.查看数据概况;求得邮编的范围。
# 查看数据概况
summary(df)
# 求得邮编的范围
range(df$ZIP.Code)
## [1] 603 99929
3.我们默认电话号码是个数值,没有实际意义;应用sapply函数,通过调用用户自定义函数,返回电话号码的最大值、最小值、均值、中位数、标准差和方差。
# 自定义函数
getSummary <- function(x, na.omit=FALSE) {
if(na.omit)
x <- x[!is.na(x)]
getMax <- max(x)
getMin <- min(x)
getMean <- mean(x)
getMedian <- median(x)
getSd <- sd(x)
getVar <- var(x)
return(c(
max = getMax,
min = getMin,
mean = getMean,
median = getMedian,
sd = getSd,
var = getVar
))
}
# sapply(X, FUN, …,simplify) 输入为列表(list) 返回值为向量
sapply(df["Phone.Number"], getSummary)
## Phone.Number
## max 9.898943e+09
## min 9.369338e+08
## mean 5.829414e+09
## median 6.033435e+09
## sd 2.333778e+09
## var 5.446519e+18
4.利用 aggregate 求取各州的电话号码的中位数。
# aggregate(x,by,FUN)
aggregate(df$Phone.Number, by = list(State = df$State), median)
## State x
## 1 AK 9074869592
## 2 AL 2563366806
## 3 AR 5019772300
## 4 AS 6846334590
## 5 AZ 6024974278
## 6 CA 6506965270
## 7 CO 7202251000
## 8 CT 8603446000
## 9 DC 2027456100
## 10 DE 3026453300
……
5.利用 by 求取各城市的电话号码的最大值和最小值;显示结果的前 3 条数据。
getMaxAndMin <- function(x, na.omit=FALSE) {
if(na.omit)
x <- x[!is.na(x)]
getMax <- max(x)
getMin <- min(x)
return(c(max = getMax, min = getMin))
}
# by(data, INDICES, FUN, …, simplify = TRUE)
# 将data中的数据,按照INDICES里面的内容拆分成若干个小的data frame,并且在每一小块data frame上应用FUN函数。
head(by(df$Phone.Number, df$City, getMaxAndMin), n = 3)
## $ABBEVILLE
## max min
## 8643665011 3378986501
##
## $ABERDEEN
## max min
## 6056225000 3605328330
##
## $`ABERDEEN `
## max min
## 6623692455 6623692455
6.对所属州生成简单的频数统计表;并将这个频数表转化为比例值。
# 对所属州生成简单的频数统计表
stable <- table(df$State)
stable
# 将频数表转化为比例值
ptable <- prop.table(stable)
ptable
7.建立所属州和医院类型的二维列联表,命名为 mycontable;按列生成边际和。
# 所属州和医院类型的二维列联表
mycontable <- with(df, table(State, Hospital.Type))
head(mycontable)
# 按列生成边际和
margin.table(mycontable, 2)
8.利用 CrossTable 建立所属乡镇和是否提供急救服务字段的二维列联表,命名为 mycrosstable。
# install.packages("gmodels")
library(gmodels)
mycrosstable <- CrossTable(df$County, df$Emergency.Services)
head(mycrosstable)
1.通过读取文件 deathrate.csv获取数据保存到death中,通过卡方检验来检验年龄与男性生存人口数(二级列联表)之间是否独立。
# 读取数据保存到death中
death <- read.csv("R\\data\\ex4\\death rate.csv")
# 卡方检验
library(vcd)
# 生成列联表
mytable <- xtabs( ~ Male_Exp + Age, data = death)
# 卡方检验
# 原假设:年龄与男性生存人口数独立
# 备择假设H1:年龄与男性生存人口数不独立,即存在某种关系
chisq.test(mytable)
##
## Pearson's Chi-squared test
##
## data: mytable
## X-squared = 617857, df = 609201, p-value = 2.956e-15
# p小于0.05,有足够理由否定H0,即说明年龄与男性生存人口数独立
2.通过 assocstats 函数来度量年龄与男性的死亡率(二级列联表)之间的相关性。
# 生成列联表
mytable <- xtabs( ~ q_male + Age, data = death)
# 相关性
assocstats(mytable)
## X^2 df P(> X^2)
## Likelihood Ratio 51232 505978 1.00000
## Pearson 503827 505978 0.98387
##
## Phi-Coefficient : NA
## Contingency Coeff.: 0.994
## Cramer's V : 0.888
# phi系数、列联系数、Cramer's V系数
# 总体来说,较大的值意味着较强的相关性
3.计算年龄与男性的死亡率之间的Pearson和Spearman相关系数,death中所有变量的协方差。
# Pearson积差相关系数
cor(death[,c('q_male','Age')])
## q_male Age
## q_male 1 NA
## Age NA 1
# Spearman相关系数
cor(death[,c('q_male','Age')], method="spearman")
## q_male Age
## q_male 1 NA
## Age NA 1
# 协方差
cov(death)
4.检验女性生存人口数和男性生存人口数之间的相关性的显著性。
# 检验女性生存人口数和男性生存人口数的Pearson相关系数为0的原假设
cor.test(death[,'Female_Exp'],death[,'Male_Exp'])
##
## Pearson's product-moment correlation
##
## data: death[, "Female_Exp"] and death[, "Male_Exp"]
## t = 550.72, df = 6103, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.9895806 0.9905709
## sample estimates:
## cor
## 0.990088
# p-value 远小于0.05 拒绝原假设
# 女性生存人口数和男性生存人口数之间的总体相关度不为零
# install.packages("psych")
library(psych)
corr.test(death[,c('Female_Exp','Male_Exp')], use="complete")
## Call:corr.test(x = death[, c("Female_Exp", "Male_Exp")], use = "complete")
## Correlation matrix
## Female_Exp Male_Exp
## Female_Exp 1.00 0.99
## Male_Exp 0.99 1.00
## Sample Size
## [1] 6105
## Probability values (Entries above the diagonal are adjusted for multiple tests.)
## Female_Exp Male_Exp
## Female_Exp 0 0
## Male_Exp 0 0
##
## To see confidence intervals of the correlations, print with the short=FALSE option
通过读取文件 outcome-of-care-measures.csv获取数据保存到care_df中。通过写一个名为 best 的函数,找到一个州中最好的医院。函数有两个参数,一个是有两个字母缩写的州名称,另一个是结果名称,包括(heartattack、heartfailure、pneumonia),函数的返回结果为30天死亡率最低的医院名称。在处理排名的时候,如果出现死亡率相等的情况,将医院按照字母表顺序排序,取第一家医院。
# 读取数据保存到care_df中
care_df <- read.csv("R\\data\\ex4\\outcome-of-care-measures.csv")
# best函数
best <- function(state, outcome) {
if (!state %in% care_df$State)
return("invalid state")
if (!outcome %in% c("heart attack", "heart failure", "pneumonia"))
return("invalid outcome")
a <- care_df[care_df$State == state,]
if (outcome == "heart attack") {
a <-
a[a$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Attack != "Not Available",]
a$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Attack <-
as.numeric(a$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Attack)
b <-
a[order(a$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Attack), ]
} else if (outcome == "heart failure") {
a <-
a[a$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Failure != "Not Available",]
a$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Failure <-
as.numeric(a$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Failure)
b <-
a[order(a$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Failure), ]
} else{
a <-
a[a$Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia != "Not Available",]
a$Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia <-
as.numeric(a$Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia)
b <-
a[order(a$Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia), ]
}
return(hospital = b[1,]["Hospital.Name"])
}
best("TX", "heart failure")
## Hospital.Name
## 3935 FORT DUNCAN MEDICAL CENTER
best("MD", "heart attack")
## Hospital.Name
## 1875 JOHNS HOPKINS HOSPITAL, THE
best("MD", "pneumonia")
## Hospital.Name
## 1900 GREATER BALTIMORE MEDICAL CENTER
best("BB", "heart attack")
## [1] "invalid state"
best("NY", "hert attack")
## [1] "invalid outcome"