(1) level表示额外的信息,包含向量中不同值的记录
> x<-c(5,12,13,12) > xf<-factor(x) > xf [1] 5 12 13 12 Levels: 5 12 13 #xf中不同数值(5,12,13)就是水平 >length(xf) [1] 4 #因子的长度定义为数据的长度,而不是水平的长度 #可以提前插入新的水平 > x<-c(5,12,13,12) > xff<-factor(x,levels = c(5,12,13,88)) > xff [1] 5 12 13 12 Levels: 5 12 13 88 > xff[2]<-88 > xff [1] 5 88 13 12 Levels: 5 12 13 88 但是不能添加非法的水平 > xff[2]<-28 Warning message: In `[<-.factor`(`*tmp*`, 2, value = 28) : 因子层次有错,产生了NA
(2)tapply函数
> ages<-c(25,26,55,37,21,42) > affils<-c("R","D","D","R","U","D") > tapply(ages,affils,mean) D R U 41 31 21 这里返回的是mean(u[x]),mean(u[y]),mean(u[z]) #也可以使用自定义函数 x <- c(1, 2, 3, 4, 5, 6) # 创建一个因子 f <- factor(c("A", "B", "A", "B", "A", "B")) # 自定义函数,计算每个子集的标准差 my_function <- function(x) { return(sd(x)) } # 使用tapply应用自定义函数 result <- tapply(x, f, my_function) print(result) #输出 A B 1.632993 1.632993 #多因子拆分 x <- c(1, 2, 3, 4, 5, 6) # 创建两个因子 f1 <- factor(c("A", "A", "B", "B", "A", "B")) f2 <- factor(c("X", "Y", "X", "Y", "Y", "X")) # 使用tapply计算平均值 result <- tapply(x, list(f1, f2), mean) print(result) #输出 X Y A 3.0 5.0 B 4.5 4.0
(3)split函数
#根据因子拆分向量 x <- c(1, 2, 3, 4, 5, 6) # 创建一个因子 f <- factor(c("A", "B", "A", "B", "A", "B")) # 使用 split() 函数拆分向量 result <- split(x, f) print(result) #输出 $A [1] 1 3 5 $B [1] 2 4 6 #根据向量拆分数据框 # 创建一个数据框 df <- data.frame( x = c(1, 2, 3, 4, 5, 6), y = c("A", "B", "A", "B", "A", "B") ) # 使用 split() 函数根据向量拆分数据框 result <- split(df, df$y) print(result) #输出 $A x y 1 1 A 3 3 A 5 5 A $B x y 2 2 B 4 4 B 6 6 B #根据自定义函数拆分向量 x <- c(1, 2, 3, 4, 5, 6) # 自定义函数,根据奇偶性拆分向量 my_function <- function(x) { ifelse(x %% 2 == 0, "Even", "Odd") } # 使用 split() 函数根据自定义函数拆分向量 result <- split(x, my_function(x)) print(result) #输出 $Odd [1] 1 3 5 $Even [1] 2 4 6
(4)by()函数
by(data, INDICES, FUN, ...) data:要拆分的数据框、列表或向量。 INDICES:用于拆分数据的因子、列表或向量。 FUN:要应用于每个子集的函数。 ...:传递给函数 FUN 的其他参数。 #对数据框的列进行拆分和求和 # 创建一个数据框 df <- data.frame( group = rep(c("A", "B", "C"), each = 3), value = 1:9 ) # 使用 by() 函数对数据框的 value 列按照 group 列进行拆分和求和 result <- by(df$value, df$group, sum) print(result) #输出 df$group: A [1] 6 ------------------------------------------------------------ df$group: B [1] 15 ------------------------------------------------------------ df$group: C [1] 24 #对列表中的元素进行拆分和求平均值 list_data <- list( A = c(1, 2, 3), B = c(4, 5, 6), C = c(7, 8, 9) ) # 使用 by() 函数对列表中的元素进行拆分和求平均值 result <- by(list_data, names(list_data), mean) print(result) #输出 names(list_data): A [1] 2 ------------------------------------------------------------ names(list_data): B [1] 5 ------------------------------------------------------------ names(list_data): C [1] 8 #对向量进行拆分和自定义操作 # 创建一个向量 x <- c(1, 2, 3, 4, 5, 6) # 创建一个因子 f <- factor(c("A", "B", "A", "B", "A", "B")) # 自定义函数,计算每个子集的中位数 my_function <- function(x) { return(median(x)) } # 使用 by() 函数对向量按照因子进行拆分和计算中位数 result <- by(x, f, my_function) print(result) #输出 f: A [1] 2 ------------------------------------------------------------ f: B [1] 4
(5)表的操作
> 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,f1,length) a bc 5 2 NA 12 1 1 #根据以上学习的tapply,得到的分组如下,但是事实上NA应该为0,因为没有第一因子是5,第二银子为"bc"的例子 所以应该用table()建表 > table(f1) f1.2 f1.1 a bc 5 2 0 12 1 1 13 2 1 #这里计算的是频数 #这里用一维的频数理解一下 > table(c(5,12,13,12,8,5)) 5 8 12 13 2 1 2 1 #也可以建立三维表 > gender<-c("M","M","F","M","F","F") > race<-c("W","W","A","O","B","B") > pol<-c("L","L","C","L","L","C") > v<-data.frame(gender,race,pol) > v gender race pol 1 M W L 2 M W L 3 F A C 4 M O L 5 F B L 6 F B C > vt<-table(v) > vt , , pol = C race gender A B O W F 1 1 0 0 M 0 0 0 0 , , pol = L race gender A B O W F 0 1 0 0 M 0 0 1 2
(6)对表的矩阵操作
> ct<-read.table("D://ct.dat",header=T) > ct Vote.for.X Voted.For.X.Last.Time 1 YES YES 2 YES NO 3 NO NO 4 Not Sure YES 5 NO NO > cttab<-table(ct) > cttab Voted.For.X.Last.Time Vote.for.X NO YES NO 2 0 Not Sure 0 1 YES 1 1 #在R中,我们还是把表当作矩阵进行处理 > class(cttab) [1] "table" > cttab[1,1] [1] 2 NO YES 2 0 #与标量进行运算 > cttab/5 Voted.For.X.Last.Time Vote.for.X NO YES NO 0.4 0.0 Not Sure 0.0 0.2 YES 0.2 0.2 #以下为Vote.for.X变量的边际值:2+0=2,0+1=1,1+1=2 > apply(cttab,1,sum) NO Not Sure YES 2 1 2 #实际上可以用addmargins()解决边际值问题 > addmargins(cttab) Voted.For.X.Last.Time Vote.for.X NO YES Sum NO 2 0 2 Not Sure 0 1 1 YES 1 1 2 Sum 3 2 5 > #这样可以得到一个二维的边际数据 #dimnames可以得到边际值的名称和水平值 > dimnames(cttab) $Vote.for.X [1] "NO" "Not Sure" "YES" $Voted.For.X.Last.Time [1] "NO" "YES"
(7)aggregate()函数
用于按照指定的因子变量对数据进行分组,并对每个组应用一个函数进行聚合操作
aggregate(formula, data, FUN, ...)
formula 是一个公式对象,用于定义要聚合的变量和分组的因子变量。
data 是一个数据框或数据集,包含要聚合的数据。
FUN 是一个函数,用于指定要应用于每个分组的聚合操作。常见的函数有sum、mean、median、max、min等。
df <- data.frame( group = c("A", "A", "B", "B", "C", "C"), value = c(10, 15, 5, 8, 20, 25) ) # 使用aggregate函数计算平均值 result <- aggregate(value ~ group, data = df, FUN = mean) #计算每一组因子的平均值 > result group value 1 A 12.5 2 B 6.5 3 C 22.5
(8)cut()函数
cut()函数用于将连续型的数值变量划分为离散的区间
cut(x, breaks, labels = NULL, include.lowest = FALSE, right = TRUE, dig.lab = 3, ...)\
x 是要进行切分的数值变量。
breaks 是用于指定区间的断点。可以有多种不同的方式来指定断点,例如一个整数(表示分割成等宽的区间)、一个向量(表示自定义的断点)、一个数值表示分割的区间个数等。
labels 是可选参数,用于指定每个区间的标签。如果未指定,则默认使用区间的范围作为标签。
当labels = FALSE时,切分后的区间将使用数字表示。例如,如果将数值变量划分为3个区间,那么第一个区间将表示为1,第二个区间表示为2,以此类推。
当labels = TRUE时,切分后的区间将使用字符型的标签表示。默认情况下,将使用区间的范围作为标签。例如,如果将数值变量划分为三个区间,范围分别为(0, 30]、(30, 60]和(60, 100],则标签分别为(0, 30]、(30, 60]和(60, 100]。
include.lowest 是一个逻辑值(TRUE或FALSE),表示是否包括最小值在内的左端点。
right 是一个逻辑值,用于指定区间是否是右开的。
dig.lab 是一个整数,表示标签的小数位数。
values <- c(10, 20, 30, 40, 50, 60, 70) # 使用cut函数进行切分 cut_values <- cut(values, breaks = c(0, 30, 60, 100)) print(cut_values) [1] (0,30] (0,30] (0,30] (30,60] (30,60] (30,60] (60,100] Levels: (0,30] (30,60] (60,100] > z<-c(0.88,0.28,0.58,0.42,0.46,0.24,0.0528,0.88) > z<-c(0.88,0.28,0.58,0.42,0.46,0.24,0.0528,0.88035) > seq(from=0.0,to=1.0,by=0.1) [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 > binmarks<-seq(from=0.0,to=1.0,by=0.1) > cut(z,binmarks,labels = F) [1] 9 3 6 5 5 3 1 9 #例如z[1],0.88落在第九个区间,即(0.0,0.1]