因子
#可以看做一個(gè)附加了更多信息的向量沮尿,包括向量中不同值的記錄
#稱為水平level
x <- c(4,23,12,3)
xf <- factor(x)
#3,4,12,23就是水平
#數(shù)據(jù)是按照重新編碼為水平,2,4,3,1
#另外水平本身也被記錄了缴饭,是被記做字符
#因子的長(zhǎng)度為數(shù)據(jù)的長(zhǎng)度
length(xf)
#提前插入新的水平
x <- c(5,12,13,12)
xff <- factor(x,levels = c(5,12,13,88))
xff[2] <- 88```
#tapply()函數(shù)
利用因子或者因子表,使用對(duì)應(yīng)函數(shù)對(duì)數(shù)據(jù)框進(jìn)行操作
因子表中因子需要與x有相同的長(zhǎng)度
因子表的一部分是向量的話,需要使用函數(shù)as.factor()強(qiáng)制將其轉(zhuǎn)化為因子
tapply()執(zhí)行操作是竭贩,將x分組,每組對(duì)應(yīng)一個(gè)因子水平
或者一組因子水平的組合莺禁,得到x的子向量留量,然后子向量應(yīng)用函數(shù)g
ages <- c(25,26,55,37,21,42)
因子保持和x相同長(zhǎng)度,affils對(duì)應(yīng)不同索引,然后分組
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)
#應(yīng)用tapply()函數(shù),對(duì)d$income進(jìn)行分析
tapply(d$income,list(d$gender,d$over25),mean)
#tapply(x,f,func)中x為向量楼熄,不能是數(shù)據(jù)庫(kù)```
#split()函數(shù)
split(x,f)x可以是數(shù)據(jù)框,然后將x根據(jù)因子表劃分成組
split(d$income,list(d$gender,d$over25))
輸出是一個(gè)列表浩峡,也就是分組的組件組成列表
將數(shù)據(jù)迅速按照因子表進(jìn)行分組
g <- c("M","F","F","I","M","M","F")
x與因子表的長(zhǎng)度要一致
split(1:7,g)
findword()函數(shù)的改寫(xiě)
findwords <- function(tf){
讀取字符串?dāng)?shù)據(jù)可岂,然后是返回一個(gè)字符串向量
txt <- scan(tf,what="")
將索引值按照因子向量單詞進(jìn)行分組,這樣就可以快速的
把每個(gè)單詞在什么索引提取出來(lái)了,返回一個(gè)列表
words <- split(1:length(txt),txt)
return(words)
}```
by()函數(shù)
#tapply()函數(shù)第一個(gè)參數(shù)必須是向量翰灾,不能是矩陣或者數(shù)據(jù)框
#然后by()函數(shù)使應(yīng)用于對(duì)象而不僅是向量
aba <- read.csv("abalone.csv",header = T)
#aba是讀取出來(lái)的數(shù)據(jù)框
#使用by函數(shù)對(duì)aba數(shù)據(jù)框中的2,3列根據(jù)gender作為因子進(jìn)行回歸分析
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個(gè)子向量缕粹,然后用length函數(shù)
tapply(u,f1,length)
table()函數(shù)第一個(gè)參數(shù)是因子或者因子的列表
table(f1)
一個(gè)能被當(dāng)成因子的對(duì)象頻數(shù)就是1
使用table()得到一維的頻數(shù)表,每個(gè)因子的頻數(shù)
table(c(5,12,13,12,8,5))
R用table()將三維表以一系列二維表的形式打印出來(lái)
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)
可以使用矩陣的操作來(lái)用在表中预侯,如cttab[1,1],cttab[,1]第一列
dimnames()函數(shù)獲得維度的名稱和水平值```
提取子表
#rje包致开,Subset(子集) an array,subset()函數(shù)默認(rèn)不計(jì)算NA值
#subtable()完成子表的提取
#第一個(gè)參數(shù)是tbl,感興趣的表萎馅,第二個(gè)參數(shù)是subnames是列表双戳,想要提取的子表
#該列表的每個(gè)組件都是以tbl的某個(gè)維度命名,然后組件的值是所需水平的名稱向量
x <- c("yes","yes","no","not sure")
y <- c("yes","no","yes","no")
#使用水平(因子向量)來(lái)建立表
d <- list(x,y)
td <- table(d)
#由數(shù)據(jù)框建立好了table
#使用subtable()提取子表
#首先建立要提取的子表列表
nl <- list(d.1 = c("no","yes"),d.2 = c("no","yes"))
library(rje)
#第二個(gè)參數(shù)是an integer vector containing the dimensions of x to subset
subtable(td,c(1,2),nl)```
#aggregate()函數(shù)
對(duì)分組中的每一個(gè)變量調(diào)用tapply()函數(shù)
aggregate(aba[,1],list(aba$gender),median)
首先第一個(gè)參數(shù)表示去除第一列之外的整個(gè)數(shù)據(jù)框
第二個(gè)參數(shù)是列表糜芳,以gender進(jìn)行分組
使用median函數(shù)處理分組后的每一個(gè)變量```
cut()函數(shù)
#可以用來(lái)生成因子
#函數(shù)需要數(shù)據(jù)向量x和向量b定義的一組區(qū)間
#函數(shù)將確定x中每個(gè)元素落入哪個(gè)區(qū)間飒货,返回落入的區(qū)間索引值
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)```