因子
函数factor()
用来把一个向量编码成为一个因子.一般形式为:
factor(x, levels = sort(unique(x), na.last = TRUE), labels, exclude = NA, ordered = FALSE)
- 可以自行指定各离散取值水平(
levels
),不指定时由x的不同值来求得。 labels
可以用来指定各水平的标签,不指定时用各离散取值的对应字符串。exclude
参数用来指定要转换为缺失值(NA)的元素值集合。如果指定了levels
,则因子的第i
个元素当它等于水平中第j个时元素值取“j”,如果它的值没有出现在levels
中则对应因子元素值取NA。ordered
取真值时表示因子水平是有次序的(按编码次序)。- 可以用
is.factor()
检验对象是否因子,用as.factor()
把一个向量转换成一个因子。
例子:
x=c(1,0,1,1,0,2)
y=factor(x,levels=c(1,0),
labels=c("男", "女"),exclude=NA,order=F)
y
[1] 男 女 男 男 女 <NA>
Levels: 男 女
因子的基本统计是频数统计,用函数table()来计数。
sex = factor(c("男", "女", "男", "男", "女"))
res.tab <- table(sex)
res.tab
res.tab
男 女
3 2
可以用两个或多个因子进行交叉分类。比如,性别sex
和职业job
交叉分组可以用table(sex, job)
来统计每一交叉类的频数,结果为一个矩阵,矩阵带有行名和列名,分别为两个因子的各水平名。
job=factor(c("teacher", "worker","worker", "worker","teacher"));
sex = factor(c("男", "女", "男", "男", "女"));
table(sex, job);
job
sex teacher worker
男 1 2
女 1 1
tapply
函数tapply的基本用法为:
tapply (X, INDEX, FUN = NULL, ..., simplify = TRUE )
X
是向量;INDEX
是和X
同等长度的因子,FUN
是要执行的函数,simplify
取默认的TRUE,返回一个标量,取FALSE
时,返回一个列表list。
tapply(h, sex, mean, simplify=F)
$男
[1] 168.3333
$女
[1] 164.5
d <- data.frame(list(gender=c("M","M","F","M","F","F"),age=c(47,59,21,32,33,24),income=c(55000,88000,32450,76500,123000,45650)))
d$over25 <- ifelse(d$age > 25,1,0)
tapply(d$income,list(d$gender,d$over25),mean)
0 1
F 39050 123000.00
M NA 73166.67
tapply和sapply区别
前者返回列表后者向量结果
L1<-list(1:3,25:29)
lapply(L1,median)
[[1]]
[1] 2
[[2]]
[1] 27
sapply(L1,median)
[1] 2 27
merge
类似于SAS等其他统计软件,可以通过它将两张表根据某个共同变量的值组合到一起. 简单调用形式为merge(x,y):引用网上资料:R语言之merge详解
merge函数的声明:
merge(x, y, by = intersect(names(x), names(y)),
by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
sort = TRUE, suffixes = c(".x",".y"),
incomparables = NULL, ...)
merge函数参数的说明:
x,y:用于合并的两个数据框
by,by.x,by.y:指定依据哪些行合并数据框,默认值为相同列名的列.
all,all.x,all.y:指定x和y的行是否应该全在输出文件.
sort:by指定的列是否要排序.
suffixes:指定除by外相同列名的后缀.
incomparables:指定by中哪些单元不进行合并.
例子:
w1:
NAME SCHOOL CLASS ENGLISH
A S1 10 85
B S2 5 50
A S1 4 90
A S1 11 90
C S1 1 12
w2:
NAME SCHOOL CLASS MATHS ENGLISH
A S3 5 80 88
B S2 5 89 81
C S1 1 55 32
按照NAME, SCHOOL, CLASS合并w1和w2:
merge(w1, w2, all = T)
NAME SCHOOL CLASS ENGLISH MATHS
1 A S1 4 90 NA
2 A S1 10 85 NA
3 A S1 11 90 NA
4 A S3 5 88 80
5 B S2 5 50 NA
6 B S2 5 81 89
7 C S1 1 12 NA
8 C S1 1 32 55
merge(w1, w2, by = c("NAME", "SCHOOL", "CLASS"), all = T)
NAME SCHOOL CLASS ENGLISH.x MATHS ENGLISH.y
1 A S1 4 90 NA NA
2 A S1 10 85 NA NA
3 A S1 11 90 NA NA
4 A S3 5 NA 80 88
5 B S2 5 50 89 81
6 C S1 1 12 55 32
merge(w1, w2, all = T, by = "NAME", incomparables = "A")
NAME SCHOOL.x CLASS.x ENGLISH.x SCHOOL.y CLASS.y MATHS ENGLISH.y
1 A S1 10 85 <NA> NA NA NA
2 A S1 4 90 <NA> NA NA NA
3 A S1 11 90 <NA> NA NA NA
4 A <NA> NA NA S3 5 80 88
5 B S2 5 50 S2 5 89 81
6 C S1 1 12 S1 1 55 32
split
划分组
d
gender age income over25
1 M 47 55000 1
2 M 59 88000 1
3 F 21 32450 0
4 M 32 76500 1
5 F 33 123000 1
6 F 24 45650 0
Grp<-split(d$income,list(d$gender,d$over25))
返回的是以列表存储的分组结果,第一个自变量可以是数据框
by()
aba <- read.csv("abalone.data",header=TRUE)
by(aba,aba$Gender,function(m) lm(m[,2]~m[,3]))
读入数据; 按性别分组后,对第2列关于第3列分别做线性回归.
formatC
类似C语言的printf格式功能,formatC对输入向量的每一个元素单独进行格式转换而不生成统一格式
在formatC()函数中可以用format=参数指定C格式类型,如“d”(整数),“f”(定点实数),“e”(科学记数法),“E”, “g”(选择位数较少的输出格式),“G”, “fg”(定点实数但用digits 指定有效位数),“s”(字符串)
可以用width指定输出宽度,用digits指定有效位数(格式为e,E,g,G,fg时)或小数点后位数(格式为f)时。可以用flag参数指定一个输出选项字符串,字符串中有”-“表示输出左对齐,有”0”表示左空白用0填充,有”+”表示要输出正负号,等等。
例如,我们有一个矩阵da中保存了三个日期的年、月、日
da
[,1] [,2] [,3]
[1,] 99 1 3
[2,] 96 11 9
[3,] 65 5 18
为了输出这三个日期,可以用apply函数指定对每一行作用一个输出函数,此输出函数利用cat()和formatC来控制:
apply(da, 1, function(r) cat(formatC(r[1], format='d', width=2, flag='0'), '-', formatC(r[2], format='d', width=2, flag='0'), '-', formatC(r[3], format='d', width=2, flag='0'), '\n', sep=''))