R--因子与表

因子

#可以看做一个附加了更多信息的向量,包括向量中不同值的记录
#称为水平level
x <- c(4,23,12,3)
xf <- factor(x)
#3,4,12,23就是水平
#数据是按照重新编码为水平,2,4,3,1
#另外水平本身也被记录了,是被记做字符
#因子的长度为数据的长度
length(xf)
#提前插入新的水平
x <- c(5,12,13,12)
xff <- factor(x,levels = c(5,12,13,88))
xff[2] <- 88```

#tapply()函数

利用因子或者因子表,使用对应函数对数据框进行操作

因子表中因子需要与x有相同的长度

因子表的一部分是向量的话,需要使用函数as.factor()强制将其转化为因子

tapply()执行操作是,将x分组,每组对应一个因子水平

或者一组因子水平的组合,得到x的子向量,然后子向量应用函数g

ages <- c(25,26,55,37,21,42)

因子保持和x相同长度,affils对应不同索引,然后分组

affils <- c("R","U","R","U","D","D")
tapply(ages,affils,mean)```

多重因子的情况

d <- data.frame(list(gender = c("M","M","F","M","F","F"),
                     age=c(47,59,21,32,43,23),
                     income = c(55000,88000,32450,76500,123000,45650)))
#加入新的因子组,年龄大于25为1
d$over25 <- ifelse(d$age > 25,1,0)
#应用tapply()函数,对d$income进行分析
tapply(d$income,list(d$gender,d$over25),mean)
#tapply(x,f,func)中x为向量,不能是数据库```

#split()函数

split(x,f)x可以是数据框,然后将x根据因子表划分成组

split(d$income,list(d$gender,d$over25))

输出是一个列表,也就是分组的组件组成列表

将数据迅速按照因子表进行分组

g <- c("M","F","F","I","M","M","F")

x与因子表的长度要一致

split(1:7,g)

findword()函数的改写

findwords <- function(tf){

读取字符串数据,然后是返回一个字符串向量

txt <- scan(tf,what="")

将索引值按照因子向量单词进行分组,这样就可以快速的

把每个单词在什么索引提取出来了,返回一个列表

words <- split(1:length(txt),txt)
return(words)
}```

by()函数

#tapply()函数第一个参数必须是向量,不能是矩阵或者数据框
#然后by()函数使应用于对象而不仅是向量
aba <- read.csv("abalone.csv",header = T)
#aba是读取出来的数据框
#使用by函数对aba数据框中的2,3列根据gender作为因子进行回归分析
by(aba,aba$gender,function(m) lm(m[,2]~m[,3]))```

#表的操作

u <- c(22,8,33,6,8,29,-2)
f1 <- list(c(5,12,13,12,13,5,13),c("a","bc","a","a","bc","a","a"))

tapply使用因子将向量u划分成6个子向量,然后用length函数

tapply(u,f1,length)

table()函数第一个参数是因子或者因子的列表

table(f1)

一个能被当成因子的对象频数就是1

使用table()得到一维的频数表,每个因子的频数

table(c(5,12,13,12,8,5))

R用table()将三维表以一系列二维表的形式打印出来

ls <- list(gender=c("M","M","F","M"),race=c("w","w","A","O"),pol=c("L","L","C","L"))
fmls <- data.frame(ls)
vt <- table(fmls)

可以使用矩阵的操作来用在表中,如cttab[1,1],cttab[,1]第一列

dimnames()函数获得维度的名称和水平值```

提取子表

#rje包,Subset(子集) an array,subset()函数默认不计算NA值
#subtable()完成子表的提取
#第一个参数是tbl,感兴趣的表,第二个参数是subnames是列表,想要提取的子表
#该列表的每个组件都是以tbl的某个维度命名,然后组件的值是所需水平的名称向量
x <- c("yes","yes","no","not sure")
y <- c("yes","no","yes","no")
#使用水平(因子向量)来建立表 
d <- list(x,y)
td <- table(d)
#由数据框建立好了table
#使用subtable()提取子表
#首先建立要提取的子表列表
nl <- list(d.1 = c("no","yes"),d.2 = c("no","yes"))
library(rje)
#第二个参数是an integer vector containing the dimensions of x to subset
subtable(td,c(1,2),nl)```

#aggregate()函数

对分组中的每一个变量调用tapply()函数

aggregate(aba[,1],list(aba$gender),median)

首先第一个参数表示去除第一列之外的整个数据框

第二个参数是列表,以gender进行分组

使用median函数处理分组后的每一个变量```

cut()函数

#可以用来生成因子
#函数需要数据向量x和向量b定义的一组区间
#函数将确定x中每个元素落入哪个区间,返回落入的区间索引值
x <- c(4,3,4,5,6,1)
y <- seq(from=0,to=10,by=1)
#labels for the levels of the resulting category.
#By default, labels are contructed using "(a,b] interval notation
#if false,simple integer codes are returned instead of a factor
cut(x,y,labels = F)```

你可能感兴趣的:(R--因子与表)