• R语言数据结构---数据框


    目录

    (1)创建数据框

    (2)访问数据框

    (3)提取子数据框

    (4)缺失值的处理

    (5)使用rbind()和cbind()

    (6)apply()

    (7)合并数据框

    (8)应用于数据框的函数:lapply()和sapply()


    (1)创建数据框
    1. > d<-data.frame(list(kids=c("Jack","Jill"),ages=c(12,10)))
    2. > d
    3. kids ages
    4. 1 Jack 12
    5. 2 Jill 10
    6. > d$ages
    7. [1] 12 10

     (2)访问数据框

    •通过组件的索引值或组件名来访问数据框中的组件

    1. > d[[1]]
    2. [1] "Jack" "Jill"
    3. > d$kids
    4. [1] "Jack" "Jill"

    •也可以通过类似矩阵的方式访问

    1. > d[,1]
    2. [1] "Jack" "Jill"

    用str()查看d的内部结构,可以看出d具有矩阵的特征

    1. > str(d)
    2. 'data.frame': 2 obs. of 2 variables:
    3. $ kids: chr "Jack" "Jill"
    4. $ ages: num 12 10

    (3)提取子数据框

    •使用[  ]运算符提取特定行和列

    1. # 创建一个示例数据框
    2. df <- data.frame(
    3. name = c("Alice", "Bob", "Charlie"),
    4. age = c(25, 30, 35),
    5. gender = c("female", "male", "male")
    6. )
    7. # 提取第 2 行和第 3 列到第 4 列的子数据框
    8. subset_df <- df[2, 3:4]
    9. # 输出子数据框
    10. print(subset_df)
    11. # 输出:
    12. # gender
    13. # 2 male
    14. #保留提取子数据框时的空行或空列
    15. > df <- data.frame(
    16. + name = c("Alice", "Bob", "Charlie"),
    17. + age = c(25, NA, 35),
    18. + gender = c("female", "", "male")
    19. + )
    20. > subset_df <- df[, , drop = FALSE]
    21. >
    22. > print(subset_df)
    23. name age gender
    24. 1 Alice 25 female
    25. 2 Bob NA
    26. 3 Charlie 35 male

    •使用subset()函数提取符合条件的子数据框

    1. # 创建一个示例数据框
    2. df <- data.frame(
    3. name = c("Alice", "Bob", "Charlie"),
    4. age = c(25, 30, 35),
    5. gender = c("female", "male", "male")
    6. )
    7. # 提取年龄大于等于 30 的子数据框
    8. subset_df <- subset(df, age >= 30)
    9. # 输出子数据框
    10. print(subset_df)
    11. # 输出:
    12. # name age gender
    13. # 2 Bob 30 male
    14. # 3 Charlie 35 male
    15. # 创建一个示例数据框
    16. df <- data.frame(
    17. name = c("Alice", "Bob", "Charlie"),
    18. age = c(25, NA, 35),
    19. gender = c("female", "", "male")
    20. )
    21. # 提取子数据框并保持空行和空列
    22. subset_df <- subset(df, , drop = FALSE)
    23. # 输出子数据框
    24. print(subset_df)
    25. > subset_df
    26. name age gender
    27. 1 Alice 25 female
    28. 2 Bob NA
    29. 3 Charlie 35 male

    •使用逻辑运算符和比较运算符提取符合条件的子数据框

    1. # 创建一个示例数据框
    2. df <- data.frame(
    3. name = c("Alice", "Bob", "Charlie"),
    4. age = c(25, 30, 35),
    5. gender = c("female", "male", "male")
    6. )
    7. # 提取年龄大于等于 30 且性别为男性的子数据框
    8. #保留所有的列,筛选行
    9. subset_df <- df[df$age >= 30 & df$gender == "male", ]
    10. # 输出子数据框
    11. print(subset_df)
    12. # 输出:
    13. # name age gender
    14. # 2 Bob 30 male
    15. # 3 Charlie 35 male

    (4)缺失值的处理
    1. > x<-c(2,NA,4)
    2. > mean(x)
    3. [1] NA
    4. > mean(x,na.rm = TRUE)
    5. [1] 3
    6. #在subset()函数中,不用自己设定na.rm=TRUE
    7. df[df$age >= 30 & df$gender == "male", ]
    8. #上面的语句也可以写为
    9. subset(df,age>=30 & gender=="male")
    10. #可以不用写为
    11. subset(df,df$age>=30 & df$gender=="male")
    12. #用于检测数据框或矩阵中是否存在缺失值,并返回一个逻辑向量,指示每个观测是否完整(不包含缺失值)
    13. df <- data.frame(
    14. name = c("Alice", "Bob", NA, "Dave"),
    15. age = c(25, 30, NA, 40),
    16. gender = c("female", "male", NA, "male")
    17. )
    18. # 使用 complete.cases() 检测完整观测
    19. complete_obs <- complete.cases(df)
    20. # 输出检测结果
    21. print(complete_obs)
    22. [1] TRUE TRUE FALSE TRUE
    23. #complete.cases()也可以去掉空缺值
    24. d<-data.frame(list(kids=c("Jack",NA,"Jillian","John"),ages=c(12,10,NA,13)))
    25. > d
    26. kids ages
    27. 1 Jack 12
    28. 2 <NA> 10
    29. 3 Jillian NA
    30. 4 John 13
    31. > complete.cases(d)
    32. [1] TRUE FALSE FALSE TRUE
    33. > d2<-d[complete.cases(d),]
    34. > d2
    35. kids ages
    36. 1 Jack 12
    37. 4 John 13

    (5)使用rbind()和cbind()
    1. > d2
    2. kids ages
    3. 1 Jack 12
    4. 4 John 13
    5. #rbind用于添加新行
    6. > rbind(d2,list("halo",19))
    7. kids ages
    8. 1 Jack 12
    9. 4 John 13
    10. 11 halo 19
    11. #cbind() 函数用于按列合并两个或多个对象(如向量、矩阵、数据框)
    12. #合并两个向量
    13. x <- c(1, 2, 3)
    14. y <- c("A", "B", "C")
    15. result <- cbind(x, y)
    16. print(result)
    17. x y
    18. [1,] "1" "A"
    19. [2,] "2" "B"
    20. [3,] "3" "C"
    21. #合并两个矩阵
    22. x <- matrix(1:6, nrow = 2)
    23. y <- matrix(7:12, nrow = 2)
    24. result <- cbind(x, y)
    25. print(result)
    26. [,1] [,2] [,3] [,4] [,5] [,6]
    27. [1,] 1 3 5 7 9 11
    28. [2,] 2 4 6 8 10 12
    29. #合并数据框
    30. df1 <- data.frame(x = c(1, 2, 3), y = c("A", "B", "C"))
    31. df2 <- data.frame(z = c(TRUE, FALSE, TRUE), w = c(0.1, 0.2, 0.3))
    32. result <- cbind(df1, df2)
    33. print(result)
    34. x y z w
    35. 1 1 A TRUE 0.1
    36. 2 2 B FALSE 0.2
    37. 3 3 C TRUE 0.3
    38. #可以给原来的数据框添加result中的元素
    39. > df1$number<-result$x
    40. > df1
    41. x y number
    42. 1 1 A 1
    43. 2 2 B 2
    44. 3 3 C 3

    (6)apply()

    apply(X, MARGIN, FUN, ...)

    • X:要应用函数的矩阵或数据框。
    • MARGIN:一个整数向量,指定应用函数的维度。MARGIN = 1 表示按行应用函数,MARGIN = 2 表示按列应用函数。
    • FUN:要应用的函数。
    • ...:传递给函数 FUN 的其他参数。
    1. #回顾之前apply在矩阵中的应用
    2. # 创建一个矩阵
    3. mat <- matrix(1:9, nrow = 3)
    4. # 使用 apply() 计算每行的和
    5. row_sums <- apply(mat, 1, sum)
    6. print(row_sums)
    7. [1] 12 15 18
    8. # 创建一个数据框
    9. df <- data.frame(x = c(1, 2, 3), y = c(4, 5, 6), z = c(7, 8, 9))
    10. # 使用 apply() 计算每列的均值
    11. col_means <- apply(df, 2, mean)
    12. print(col_means)
    13. #输出
    14. x y z
    15. 2 5 8
    16. #自定义函数
    17. mat <- matrix(1:9, nrow = 3)
    18. # 自定义函数:计算平方根
    19. sqrt_sum <- function(x) {
    20. sqrt(sum(x))
    21. }
    22. # 使用 apply() 应用自定义函数
    23. result <- apply(mat, 2, sqrt_sum)
    24. print(result)
    25. [1] 2.449490 3.872983 4.898979

    (7)合并数据框
    1. #按照共同的列合并数据框
    2. # 创建两个数据框
    3. df1 <- data.frame(id = c(1, 2, 3), name = c("Alice", "Bob", "Charlie"))
    4. df2 <- data.frame(id = c(2, 3, 4), age = c(25, 30, 35))
    5. # 按照共同的列 "id" 合并数据框
    6. result <- merge(df1, df2, by = "id")
    7. print(result)
    8. id name age
    9. 1 2 Bob 25
    10. 2 3 Charlie 30
    11. #按照不同的列名合并数据框
    12. # 创建两个数据框
    13. df1 <- data.frame(id = c(1, 2, 3), name = c("Alice", "Bob", "Charlie"))
    14. df2 <- data.frame(emp_id = c(2, 3, 4), age = c(25, 30, 35))
    15. # 按照不同的列 "id""emp_id" 合并数据框
    16. result <- merge(df1, df2, by.x = "id", by.y = "emp_id")
    17. print(result)
    18. id name age
    19. 1 2 Bob 25
    20. 2 3 Charlie 30
    21. #根据所有的列合并数据框
    22. # 创建两个数据框
    23. df1 <- data.frame(id = c(1, 2, 3), name = c("Alice", "Bob", "Charlie"))
    24. df2 <- data.frame(id = c(2, 3, 4), age = c(25, 30, 35))
    25. # 根据所有的列合并数据框
    26. result <- merge(df1, df2, all = TRUE)
    27. print(result)
    28. id name age
    29. 1 1 Alice NA
    30. 2 2 Bob 25
    31. 3 3 Charlie 30
    32. 4 4 <NA> 35
    1. > d<-data.frame(list(kids=c("Jack","Jill"),ages=c(12,10)))
    2. > d
    3. kids ages
    4. 1 Jack 12
    5. 2 Jill 10
    6. > d1<-data.frame(list(kids=c("Jack","Jill","Jillian","John"),states=c("CA","MA","MA","HI")))
    7. > d1
    8. kids states
    9. 1 Jack CA
    10. 2 Jill MA
    11. 3 Jillian MA
    12. 4 John HI
    13. > d2a<-rbind(d,list("Jill",15))
    14. > d2a
    15. kids ages
    16. 1 Jack 12
    17. 2 Jill 10
    18. 3 Jill 15
    19. > merge(d2a,d1)
    20. kids ages states
    21. 1 Jack 12 CA
    22. 2 Jill 10 MA
    23. 3 Jill 15 MA
    24. #由上图可知,d2a有两个Jill,但是只有一个Jill住在MA,另外一个不知道,所以匹配的时候出现错误
    25. #所以匹配向量的时候也要谨慎

    (8)应用于数据框的函数:lapply()和sapply()

    lapply():对列表(list)或向量(vector)的每个元素应用一个函数,并返回一个新的列表。

    lapply(X, FUN, ...)

    • X:要操作的列表或向量。
    • FUN:要应用到每个元素上的函数。
    • ...:其他参数,传递给 FUN 函数。
    1. #统计每个数据框的行数
    2. my_list <- list(df1 = data.frame(x = 1:3, y = 4:6),
    3. df2 = data.frame(a = 1:5, b = 6:10))
    4. # 统计每个数据框的行数
    5. result <- lapply(my_list, function(df) nrow(df))
    6. print(result)
    7. $df1
    8. [1] 3
    9. $df2
    10. [1] 5
    11. > d
    12. kids ages
    13. 1 Jack 12
    14. 2 Jill 10
    15. > d1<-lapply(d, sort)
    16. > d1
    17. #d1是由两个向量构成的列表,这两个向量是排序后的kids和ages
    18. $kids
    19. [1] "Jack" "Jill"
    20. $ages
    21. [1] 10 12
    22. #强行转化为数据框,但是这样做会丢失名字和年龄的对应关系,所以这样的转化没有意义,不用做
    23. > as.data.frame(d1)
    24. kids ages
    25. 1 Jack 10
    26. 2 Jill 12

    sapply():对数据框或列表等对象的每一列(或元素)进行逐一的操作并返回结果

    sapply(X, FUN, ...)

    • X:要操作的数据框或列表等对象。
    • FUN:要应用到每一列(或元素)上的函数。
    • ...:其他参数,传递给 FUN 函数。
    1. # 创建一个数据框
    2. df <- data.frame(x = c(1, 2, 3), y = c(4, 5, 6))
    3. # 计算每列的均值
    4. result <- sapply(df, mean)
    5. print(result)
    6. x y
    7. 2 5
    8. # 创建一个数据框
    9. df <- data.frame(x = c("a", "b", "c"), y = c("d", "e", "f"))
    10. # 合并每列的字符向量
    11. result <- sapply(df, paste, collapse = ", ")
    12. #collapse:指定向量的连接符
    13. print(result)
    14. x y
    15. "a, b, c" "d, e, f"
  • 相关阅读:
    nginx中用到的kill命令
    mysql查看正在执行的sql语句并将其kill掉
    【iOS-UIImagePickerController访问相机和相册】
    c语言分层理解(c语言文件操作)
    13.Blender 界面介绍(下) 雕刻、纹理绘制及属性
    ContentProvider与ContentResolver
    如何定义需求优先级?
    循环神经网络 - 循环神经网络的简洁实现
    第九章 REST 服务安全
    【调制解调】SSB 单边带调幅
  • 原文地址:https://blog.csdn.net/weixin_69884785/article/details/132654659