• R语言表与因子(详细知识点,深入知识点后续会补充!)


    (1) level表示额外的信息,包含向量中不同值的记录 
    1. > x<-c(5,12,13,12)
    2. > xf<-factor(x)
    3. > xf
    4. [1] 5 12 13 12
    5. Levels: 5 12 13
    6. #xf中不同数值(5,12,13)就是水平
    7. >length(xf)
    8. [1] 4
    9. #因子的长度定义为数据的长度,而不是水平的长度
    10. #可以提前插入新的水平
    11. > x<-c(5,12,13,12)
    12. > xff<-factor(x,levels = c(5,12,13,88))
    13. > xff
    14. [1] 5 12 13 12
    15. Levels: 5 12 13 88
    16. > xff[2]<-88
    17. > xff
    18. [1] 5 88 13 12
    19. Levels: 5 12 13 88
    20. 但是不能添加非法的水平
    21. > xff[2]<-28
    22. Warning message:
    23. In `[<-.factor`(`*tmp*`, 2, value = 28) : 因子层次有错,产生了NA

    (2)tapply函数
    1. > ages<-c(25,26,55,37,21,42)
    2. > affils<-c("R","D","D","R","U","D")
    3. > tapply(ages,affils,mean)
    4. D R U
    5. 41 31 21
    6. 这里返回的是mean(u[x]),mean(u[y]),mean(u[z])
    7. #也可以使用自定义函数
    8. x <- c(1, 2, 3, 4, 5, 6)
    9. # 创建一个因子
    10. f <- factor(c("A", "B", "A", "B", "A", "B"))
    11. # 自定义函数,计算每个子集的标准差
    12. my_function <- function(x) {
    13. return(sd(x))
    14. }
    15. # 使用tapply应用自定义函数
    16. result <- tapply(x, f, my_function)
    17. print(result)
    18. #输出
    19. A B
    20. 1.632993 1.632993
    21. #多因子拆分
    22. x <- c(1, 2, 3, 4, 5, 6)
    23. # 创建两个因子
    24. f1 <- factor(c("A", "A", "B", "B", "A", "B"))
    25. f2 <- factor(c("X", "Y", "X", "Y", "Y", "X"))
    26. # 使用tapply计算平均值
    27. result <- tapply(x, list(f1, f2), mean)
    28. print(result)
    29. #输出
    30. X Y
    31. A 3.0 5.0
    32. B 4.5 4.0

    (3)split函数
    1. #根据因子拆分向量
    2. x <- c(1, 2, 3, 4, 5, 6)
    3. # 创建一个因子
    4. f <- factor(c("A", "B", "A", "B", "A", "B"))
    5. # 使用 split() 函数拆分向量
    6. result <- split(x, f)
    7. print(result)
    8. #输出
    9. $A
    10. [1] 1 3 5
    11. $B
    12. [1] 2 4 6
    13. #根据向量拆分数据框
    14. # 创建一个数据框
    15. df <- data.frame(
    16. x = c(1, 2, 3, 4, 5, 6),
    17. y = c("A", "B", "A", "B", "A", "B")
    18. )
    19. # 使用 split() 函数根据向量拆分数据框
    20. result <- split(df, df$y)
    21. print(result)
    22. #输出
    23. $A
    24. x y
    25. 1 1 A
    26. 3 3 A
    27. 5 5 A
    28. $B
    29. x y
    30. 2 2 B
    31. 4 4 B
    32. 6 6 B
    33. #根据自定义函数拆分向量
    34. x <- c(1, 2, 3, 4, 5, 6)
    35. # 自定义函数,根据奇偶性拆分向量
    36. my_function <- function(x) {
    37. ifelse(x %% 2 == 0, "Even", "Odd")
    38. }
    39. # 使用 split() 函数根据自定义函数拆分向量
    40. result <- split(x, my_function(x))
    41. print(result)
    42. #输出
    43. $Odd
    44. [1] 1 3 5
    45. $Even
    46. [1] 2 4 6

    (4)by()函数

    by(data, INDICES, FUN, ...)

    • data:要拆分的数据框、列表或向量。
    • INDICES:用于拆分数据的因子、列表或向量。
    • FUN:要应用于每个子集的函数。
    • ...:传递给函数 FUN 的其他参数。
    1. #对数据框的列进行拆分和求和
    2. # 创建一个数据框
    3. df <- data.frame(
    4. group = rep(c("A", "B", "C"), each = 3),
    5. value = 1:9
    6. )
    7. # 使用 by() 函数对数据框的 value 列按照 group 列进行拆分和求和
    8. result <- by(df$value, df$group, sum)
    9. print(result)
    10. #输出
    11. df$group: A
    12. [1] 6
    13. ------------------------------------------------------------
    14. df$group: B
    15. [1] 15
    16. ------------------------------------------------------------
    17. df$group: C
    18. [1] 24
    19. #对列表中的元素进行拆分和求平均值
    20. list_data <- list(
    21. A = c(1, 2, 3),
    22. B = c(4, 5, 6),
    23. C = c(7, 8, 9)
    24. )
    25. # 使用 by() 函数对列表中的元素进行拆分和求平均值
    26. result <- by(list_data, names(list_data), mean)
    27. print(result)
    28. #输出
    29. names(list_data): A
    30. [1] 2
    31. ------------------------------------------------------------
    32. names(list_data): B
    33. [1] 5
    34. ------------------------------------------------------------
    35. names(list_data): C
    36. [1] 8
    37. #对向量进行拆分和自定义操作
    38. # 创建一个向量
    39. x <- c(1, 2, 3, 4, 5, 6)
    40. # 创建一个因子
    41. f <- factor(c("A", "B", "A", "B", "A", "B"))
    42. # 自定义函数,计算每个子集的中位数
    43. my_function <- function(x) {
    44. return(median(x))
    45. }
    46. # 使用 by() 函数对向量按照因子进行拆分和计算中位数
    47. result <- by(x, f, my_function)
    48. print(result)
    49. #输出
    50. f: A
    51. [1] 2
    52. ------------------------------------------------------------
    53. f: B
    54. [1] 4

    (5)表的操作
    1. > u<-c(22,8,33,6,8,29,-2)
    2. > f1<-list(c(5,12,13,12,13,5,13),c("a","bc","a","a","bc","a","a"))
    3. > tapply(u,f1,length)
    4. a bc
    5. 5 2 NA
    6. 12 1 1
    7. #根据以上学习的tapply,得到的分组如下,但是事实上NA应该为0,因为没有第一因子是5,第二银子为"bc"的例子
    8. 所以应该用table()建表
    9. > table(f1)
    10. f1.2
    11. f1.1 a bc
    12. 5 2 0
    13. 12 1 1
    14. 13 2 1
    15. #这里计算的是频数
    16. #这里用一维的频数理解一下
    17. > table(c(5,12,13,12,8,5))
    18. 5 8 12 13
    19. 2 1 2 1
    20. #也可以建立三维表
    21. > gender<-c("M","M","F","M","F","F")
    22. > race<-c("W","W","A","O","B","B")
    23. > pol<-c("L","L","C","L","L","C")
    24. > v<-data.frame(gender,race,pol)
    25. > v
    26. gender race pol
    27. 1 M W L
    28. 2 M W L
    29. 3 F A C
    30. 4 M O L
    31. 5 F B L
    32. 6 F B C
    33. > vt<-table(v)
    34. > vt
    35. , , pol = C
    36. race
    37. gender A B O W
    38. F 1 1 0 0
    39. M 0 0 0 0
    40. , , pol = L
    41. race
    42. gender A B O W
    43. F 0 1 0 0
    44. M 0 0 1 2

    (6)对表的矩阵操作 
    1. > ct<-read.table("D://ct.dat",header=T)
    2. > ct
    3. Vote.for.X Voted.For.X.Last.Time
    4. 1 YES YES
    5. 2 YES NO
    6. 3 NO NO
    7. 4 Not Sure YES
    8. 5 NO NO
    9. > cttab<-table(ct)
    10. > cttab
    11. Voted.For.X.Last.Time
    12. Vote.for.X NO YES
    13. NO 2 0
    14. Not Sure 0 1
    15. YES 1 1
    16. #在R中,我们还是把表当作矩阵进行处理
    17. > class(cttab)
    18. [1] "table"
    19. > cttab[1,1]
    20. [1] 2
    21. NO YES
    22. 2 0
    23. #与标量进行运算
    24. > cttab/5
    25. Voted.For.X.Last.Time
    26. Vote.for.X NO YES
    27. NO 0.4 0.0
    28. Not Sure 0.0 0.2
    29. YES 0.2 0.2
    30. #以下为Vote.for.X变量的边际值:2+0=20+1=11+1=2
    31. > apply(cttab,1,sum)
    32. NO Not Sure YES
    33. 2 1 2
    34. #实际上可以用addmargins()解决边际值问题
    35. > addmargins(cttab)
    36. Voted.For.X.Last.Time
    37. Vote.for.X NO YES Sum
    38. NO 2 0 2
    39. Not Sure 0 1 1
    40. YES 1 1 2
    41. Sum 3 2 5
    42. >
    43. #这样可以得到一个二维的边际数据
    44. #dimnames可以得到边际值的名称和水平值
    45. > dimnames(cttab)
    46. $Vote.for.X
    47. [1] "NO" "Not Sure" "YES"
    48. $Voted.For.X.Last.Time
    49. [1] "NO" "YES"

    (7)aggregate()函数

    用于按照指定的因子变量对数据进行分组,并对每个组应用一个函数进行聚合操作

    aggregate(formula, data, FUN, ...)

    • formula 是一个公式对象,用于定义要聚合的变量和分组的因子变量。
    • data 是一个数据框或数据集,包含要聚合的数据。
    • FUN 是一个函数,用于指定要应用于每个分组的聚合操作。常见的函数有summeanmedianmaxmin等。
    1. df <- data.frame(
    2. group = c("A", "A", "B", "B", "C", "C"),
    3. value = c(10, 15, 5, 8, 20, 25)
    4. )
    5. # 使用aggregate函数计算平均值
    6. result <- aggregate(value ~ group, data = df, FUN = mean)
    7. #计算每一组因子的平均值
    8. > result
    9. group value
    10. 1 A 12.5
    11. 2 B 6.5
    12. 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 是一个整数,表示标签的小数位数。
    1. values <- c(10, 20, 30, 40, 50, 60, 70)
    2. # 使用cut函数进行切分
    3. cut_values <- cut(values, breaks = c(0, 30, 60, 100))
    4. print(cut_values)
    5. [1] (0,30] (0,30] (0,30] (30,60] (30,60] (30,60] (60,100]
    6. Levels: (0,30] (30,60] (60,100]
    7. > z<-c(0.88,0.28,0.58,0.42,0.46,0.24,0.0528,0.88)
    8. > z<-c(0.88,0.28,0.58,0.42,0.46,0.24,0.0528,0.88035)
    9. > seq(from=0.0,to=1.0,by=0.1)
    10. [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
    11. > binmarks<-seq(from=0.0,to=1.0,by=0.1)
    12. > cut(z,binmarks,labels = F)
    13. [1] 9 3 6 5 5 3 1 9
    14. #例如z[1],0.88落在第九个区间,即(0.0,0.1]
  • 相关阅读:
    【视频】报告分享|展望人工智能银行:当银行遇到AI
    关于Unity Inspector上的一些常用技巧,一般用于编辑器扩展或者其他
    【达摩院OpenVI】视频目标渐进式Transformer跟踪器ProContEXT
    您的连接不是s连接 上不去g 的解决办法
    Scrapy第十篇:selenium4模拟器中间件
    Linux-centos
    谈一谈在两个商业项目中使用MVI架构后的感悟
    框架依赖-网站总结
    支持代理直连Oracle数据库,JumpServer堡垒机v2.24.0发布
    RGB彩色模型理解与编程实例
  • 原文地址:https://blog.csdn.net/weixin_69884785/article/details/132713200