dataframe简介
(1)每个数据表可以看作一个数据框(dataframe)
(2)每一列(column)作为一个向量(vector),向量可以由很多类型组成,如数值型(上图2-6列),因子型(上图7列),字符型
(3)每一行(row)作为一个记录(entry)
生成数据框的方法(一):合并各类型的因子组合成数据框
注意:
(1)dim(),colnames()/rownames()在数据框中的用法与在矩阵中的相同
(2)去数据框的子集与矩阵中的方法相同
> x=c(42,7,64,9)
> y=1:4
> z.df=data.frame(index=y,value=x)#生成一个数据框
> z.df
index value
1 1 42
2 2 7
3 3 64
4 4 9
(3)unique()函数,在向量中是去除同样的数值,数据框中是去除相同的行
> df1 = data.frame(C1= c(1, 5, 14, 1, 54), C2= c(9, 15, 85, 9, 42), C3= c(8, 7, 42, 8, 16))
> df1
C1 C2 C3
1 1 9 8
2 5 15 7
3 14 85 42
4 1 9 8
5 54 42 16
> df2=unique(df1)
> df2
C1 C2 C3
1 1 9 8
2 5 15 7
3 14 85 42
5 54 42 16
生成数据框的方法(二):从文件中读取
read.csv()参数:
header:默认参数为True,即默认把第一行作为表头
row.names=1/col.names=1:把第一行/第一列作为行名/列名
read.table()参数:
header:与read.csv函数不同,此项参数默认为False
row.names=1/col.names=1:同上
sep='\t':指定分隔符为\t键
·```
df=read.table("test.csv",sep=",",header=T,row.names = 1)
####数据框的应用
(1)子集提取:与矩阵一样,数据框中提取列有简便的方法:直接用$提取
(2)布尔筛选
(3)合并数据框:cbind()/rbind()函数的用法与矩阵一样,注意cbind()/rbind()函数在dataFram中使用时会将整合时的变量名作为增加的行的列名或者行名。在添加某一列时,也可用直接赋值的方法,即把添加的列(以向量的形式)赋值给一个新列,见本文末尾的例子。
(4)补充:子集提取函数subset();与(1)中的子集提取作用一样
subset: 指示要保留的元素或行的逻辑表达式:将缺少的值视为false。
select:选择表达式,指示要从数据帧中选择的列。
df
height weight gender
tom 180 75 male
cindy 165 58 female
jimmy 175 72 male
sam 173 68 male
lucy 160 60 female
lily 165 55 female
subset(df,select="height")#选择height列
height
tom 180
cindy 165
jimmy 175
sam 173
lucy 160
lily 165
subset(df,height>170 & weight>70)
选择身高大于170,体重大于70的行。
与df[dfweight > 70,]的效果相同
height weight gender
tom 180 75 male
jimmy 175 72 male
subset(df,height>170,select=c("weight","gender"))
选择身高大于170的行,并选择weight、gender列
weight gender
tom 75 male
jimmy 72 male
sam 68 male
###应用实例:求男性组和女性组的平均身高并做T检验
T检验:函数t.test()
法一:t.test(,)逗号前后填入要做T检验的两个向量;
法二:data参数为包含因子和要做T检验数据框或者矩阵,weight~gender意为weight列的数据按gender进行分组后对每组数据进行T检验
df
height weight gender
tom 180 75 male
cindy 165 58 female
jimmy 175 72 male
sam 173 68 male
lucy 160 60 female
lily 165 55 female
求身高平均值
tapply(dfgender,mean)#法一:求平均值
female male
163.3333 176.0000
mean(df[df$gender=='female',1])#法二:求平均值
[1] 163.3333
对男性女性身高是否有差别做T检验
maleh=df[dfgender=="female","height"]
t.test(maleh,femaleh)
t.test(,)逗号前后填入要做T检验的两个向量
Welch Two Sample t-test
data: maleh and femaleh
t = 4.75, df = 3.8173, p-value = 0.01006
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
5.120975 20.212359
sample estimates:
mean of x mean of y
176.0000 163.3333
t.test(data=df,height~gender)
data参数为包含因子和要做T检验数据框或者矩阵
weight~gender意为weight列的数据按gender进行分组后对每组数据进行T检验
Welch Two Sample t-test
data: height by gender
t = -4.75, df = 3.8173, p-value = 0.01006
alternative hypothesis: true difference in means between group female and group male is not equal to 0
95 percent confidence interval:
-20.212359 -5.120975
sample estimates:
mean in group female mean in group male
163.3333 176.0000
####应用实例:作业
计算男性和女性体重的是否有显著差异
t.test(df[dfgender=='male',"weight"])
t.test(data=df,weight~gender)
计算每个人的BMI并写入新的数据框
df
height weight gender
tom 180 75 male
cindy 165 58 female
jimmy 175 72 male
sam 173 68 male
lucy 160 60 female
lily 165 55 female
BMI=dfheight/100)^2
df1=cbind(df,BMI)
cbind()/rbind()函数的用法与矩阵一样,
注意cbind()/rbind()函数在dataFram中使用时会将整合时的变量名作为增加的行的列名或者行名
df$BMI=BMI也可以达到同样的效果,且直接修改df。第二个BMI为一个向量
df1
height weight gender BMI
tom 180 75 male 23.14815
cindy 165 58 female 21.30395
jimmy 175 72 male 23.51020
sam 173 68 male 22.72044
lucy 160 60 female 23.43750
lily 165 55 female 20.20202