• 【R语言】【4】data.frame与merge与join与cbind与rbind


    前言

    再练习一下R语言数据类型的一些基础操作

    我又遇到一本奇书(虽然大部分书都很奇),第一章就是各种画图函数的图例,章节叫绘图基础,但是形参和数据来源和解释都未知。虽然不可能解释地多详细,但是如果只是过一遍的话,为什么要占80面,差点就弃了。


             \;\\\;\\\;

    data.frame()

    df <- data.frame(
      #前面的不是形参,而是列名
      y=c('A','B','C'),
      '2010'=c(1,3,4),
      '2011'=c(3,5,2),
      '2021'=c(0,0,0),
    
      #F保证特殊符号被正常读取,T的话会在前面加个X
      check.names = T
    )
    df   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    > df    
      y X2010 X2011 X2021
    1 A     1     3     0
    2 B     3     5     0
    3 C     4     2     0
    
    • 1
    • 2
    • 3
    • 4
    • 5

             \;\\\;\\\;

    merge()

    df1 <- data.frame(
      x=c('a','b','c'),
      y=1:3
    )
    df2 <- data.frame(
      x=c('e','w','z'),
      z=c(4,5,1)
    )
    df3 <- data.frame(
      w=c('a','b','z'),
      f=4:6
    )
    df4 <- data.frame(
      x=c('a','b','d'),
      y=c(1,4,3),
      z=c(2,5,4)
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    all = T
    T是TRUE的缩写,F是FALSE的缩写
    all=F删除有缺失NA的行

    by = ‘x’
    主键是x,表中缺失为NA

    #把df1和df2按列拼起来
    merge(
      df1,
      df2,
      by='x',    #主键是x,表中缺失为NA
      all=T
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
      x  y  z
    1 a  1 NA
    2 b  2 NA
    3 c  3 NA
    4 e NA  4
    5 w NA  5
    6 z NA  1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    by.x = ‘x’
    by.y = ‘w’
    以x和w为主键进行融合,其他列拼接在后面就行(一个主键)

    #把df1和df3按列拼起来
    merge(
      df1,
      df3,
      by.x='x',
      by.y='w',
      all=T
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
      x  y  f
    1 a  1  4
    2 b  2  5
    3 c  3 NA
    4 z NA  6
    
    • 1
    • 2
    • 3
    • 4
    • 5

    by = c(‘x’,‘y’)

    以x和y为主键进行融合,其他列拼接在后面就行(两个主键)

    #把df1和df4按列拼起来
    merge(
      df1,
      df4,
      by=c('x','y'),
      all=T
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
      x y  z
    1 a 1  2
    2 b 2 NA
    3 b 4  5
    4 c 3 NA
    5 d 3  4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

             \;\\\;\\\;

    cbind()与rbind()

    df1 <- data.frame(
      x=c('a','b','c'),
      y = 1:3
    )
    
    df2 <- data.frame(
      zz=c('F','W','A'),
      g = c(2,5,4)
    )
    
    df3 <- data.frame(
      x=c('we','i'),
      y = c(2,5)
    )
    
    df1
    df2
    df3
    
    
    
    #将行数相同的按列拼接在一起
    table <- cbind(df1,df2)   #行数必须一致
    table
    
    #将列名相同的按行拼接在一起
    table <- rbind(df1,df3)   #必须列名相同
    table
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    > df1
      x y
    1 a 1
    2 b 2
    3 c 3
    
    > df2
      zz g
    1  F 2
    2  W 5
    3  A 4
    
    > df3
       x y
    1 we 2
    2  i 5
    
    > table
      x y zz g
    1 a 1  F 2
    2 b 2  W 5
    3 c 3  A 4
    
    > table
       x y
    1  a 1
    2  b 2
    3  c 3
    4 we 2
    5  i 5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

             \;\\\;\\\;

    join

    用merge()实现的join

    没有all参数(默认all=F)就是inner join

    all=T就是full join

    all.x=T就是left join

    all.y=T就是right join

             \;\\\;\\\;

    dplyr:: 的_join系列函数

    dplyr::inner_join(
    	x=df1,
    	y=df2,
    	by='x'
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    dplyr::full_join(
    	x=df1,
    	y=df2,
    	by='x'
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    dplyr::left_join(
    	x=df1,
    	y=df2,
    	by='x'
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    dplyr::right_join(
    	x=df1,
    	y=df2,
    	by='x'
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5

             \;\\\;\\\;

    aggregate()分组

    df <- data.frame(
      n=c('A','B','C','A','C'),
      '2021'=c(1,3,4,4,3),
      '2022'=c(3,5,6,2,3),
      
      #F:特殊字符正常显示为列名
      check.names = F
    )
    df
    
    #数据重组
    df_melt <- reshape2::melt(
      df,
      
      #变成n year uid三列
      id.vars = 'n',
      variable = 'year',
      value.name = 'uid'
    )
    df_melt
    
    
    #分组
    g <- aggregate(uid~year + n,df_melt,mean)
    g
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    > df
      n 2021 2022
    1 A    1    3
    2 B    3    5
    3 C    4    6
    4 A    4    2
    5 C    3    3
    
    > df_melt
       n year uid
    1  A 2021   1
    2  B 2021   3
    3  C 2021   4
    4  A 2021   4
    5  C 2021   3
    6  A 2022   3
    7  B 2022   5
    8  C 2022   6
    9  A 2022   2
    10 C 2022   3
    
    > g
      year n uid
    1 2021 A 2.5
    2 2022 A 2.5
    3 2021 B 3.0
    4 2022 B 5.0
    5 2021 C 3.5
    6 2022 C 4.5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    [Python] Python编程技巧总结[不断更新....]
    BUUCTF Reverse/crackMe
    EV证书与OV证书的区别
    SICP:惰性求值、流和尾递归(Python实现)
    webpack中tree shaking
    时间同步产品(NTP北斗时钟服务器)如何完成网络同步的?
    linux虚拟机未建分区的情况下对磁盘进行扩容
    什么是Python虚拟环境?
    word批量修改表格样式
    Helm基础知识
  • 原文地址:https://blog.csdn.net/weixin_41374099/article/details/126184242