- > 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
- > 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
- #根据因子拆分向量
-
- 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
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
- > 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
- > 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"
用于按照指定的因子变量对数据进行分组,并对每个组应用一个函数进行聚合操作
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
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]