R语言中data.frame的常用操作总结

前言:近段时间学习R语言用到最多的数据格式就是data.frame,现对data.frame常用操作进行总结,其中函数大部分来自dplyr包,该包由Hadley Wickham所作,主要用于数据的清洗和整理。

一、创建

data.frame创建较为容易,调用data.frame函数即可。本文创建一个关于学生成绩的数据框,接下来大部分操作都对该数据框进行,其中学生成绩随机产生

> library(dplyr)       #导入dplyr包
> options(digits = 0)  #保留整数
> set.seed(1)          #设置种子函数
> df <- data.frame(ID = 1:12,                                 #ID
+                  Class = rep(c(1,2,3),4),                   #班级
+                  Chinese = runif(12,min = 0,max = 100),     #语文
+                  Math = runif(12,min = 0,max = 100),        #数学
+                  English = runif(12,min = 0,max = 100))     #英语
> for (i in 1:ncol(df)) {
+   df[,i] <- as.integer(df[,i])  #将每列类型变为integer型
+ }

df结果如下

> df
   ID Class Chinese Math English
1   1     1      26   68      26
2   2     2      37   38      38
3   3     3      57   76       1
4   4     1      90   49      38
5   5     2      20   71      86
6   6     3      89   99      34
7   7     1      94   38      48
8   8     2      66   77      59
9   9     3      62   93      49
10 10     1       6   21      18
11 11     2      20   65      82
12 12     3      17   12      66

二、 查询

1、查询某一行或某一列

可通过 data.frame[行号,] 或者 data.frame[,列号] 操作完成

其中 data.frame[行号,] 得到的类型是数据框

而 data.frame[,列号] 得到的类型是该列的类型

> df[2,]
  ID Class Chinese Math English
2  2   2     37     38    38
> df[,4]
 [1] 68 38 76 49 71 99 38 77 93 21 65 12

查询某一列还可以通过 data.frame$列名 操作完成

> df$Chinese
 [1] 26 37 57 90 20 89 94 66 62  6 20 17

data.frame[列号] 得到一个仅包含该列内容的数据框

> df[3]
   Chinese
1       26
2       37
3       57
4       90
5       20
6       89
7       94
8       66
9       62
10       6
11      20
12      17

若要查找符合条件的行,可采用 which() 函数,得到的类型是数据框

> df[which(df$ID == 4),]
  ID Class Chinese Math English
4  4     1      90   49      38

2、查询某一个值

可通过 data.frame[行号,列号] 或 data.frame[行号,‘列名'] 操作完成

> df[3,4]
[1] 76
> df[3,'Math']
[1] 76

若查找符合条件的值,可采用 which() 函数

> df[which(df$Chinese == 57),'Math'] #查询语文成绩为57的同学的数学成绩
[1] 76
> df[which(df$Class == 2),'English'] #查询班级号为2的同学的英语成绩
[1] 38 86 59 82

三、修改

1、修改某一行或列

> df[1,] <- c(1,2,65,59,73)  #修改第一行
#修改英语成绩
> df[,'English'] <- c(23,45,67,87,34,46,87,95,43,76,23,94) 

修改后结果为(1号同学英语成绩先由26修改为73,再修改为23)

> df
   ID Class Chinese Math English
1   1     2      65   59      23
2   2     2      37   38      45
3   3     3      57   76      67
4   4     1      90   49      87
5   5     2      20   71      34
6   6     3      89   99      46
7   7     1      94   38      87
8   8     2      66   77      95
9   9     3      62   93      43
10 10     1       6   21      76
11 11     2      20   65      23
12 12     3      17   12      94

2、修改某一个值

直接将需要修改后的值赋给上述查询某一个值的操作即可

> df[3,'Chinese'] <- 65 #将3号同学的语文成绩修改为65
#将语文成绩低于20的同学的语文成绩修改为20
> df[which(df$Chinese < 20),'Chinese'] <- 20
> df
       ID Class Chinese Math English
1   1     2      65   59      23
2   2     2      37   38      45
3   3     3      65   76      67
4   4     1      90   49      87
5   5     2      20   71      34
6   6     3      89   99      46
7   7     1      94   38      87
8   8     2      66   77      95
9   9     3      62   93      43
10 10     1      20   21      76
11 11     2      20   65      23
12 12     3      20   12      94

3、修改行列名

可用rownames()及colnames()得到数据框的行列名,rownames(data.frame)[行号] 或 colnames(data.frame)[列号] 可得到指定位置的行名或者列名,若修改直接赋值给该变量即可

 > colnames(df)               #查询列名
 [1] "ID"      "Class"   "Chinese" "Math"    "English"
 > colnames(df)[4]            #查询第4列列名
 [1] "Math"
 > colnames(df)[4] <- "math"  #修改第4列列名为math
 #修改列名
 > colnames(df) <- c("ID","Class","Chinese","Math","English")

四、删除

删除行或列,仅需要选出该数据框的部分行或列,然后将其赋给该变量即可,其中在列号或行号前添加-表示不选该行或该列,在这里,为了方便接下来的操作,我们将选出后的数据框赋给其他变量,要实现删除操作应当将选出后的数据框赋给自己

#选出df第1、3、5列  ( df <- df[,c(1,3,5)] )
> df.tmp <- df[,c(1,3,5)]
> df.tmp
   ID Chinese English
1   1      65      23
2   2      37      45
3   3      65      67
4   4      90      87
5   5      20      34
6   6      89      46
7   7      94      87
8   8      66      95
9   9      62      43
10 10      20      76
11 11      20      23
12 12      20      94
#删除df第3行 ( df <- df[-3,] )
> df.tmp <- df[-3,]
> df.tmp
   ID Class Chinese Math English
1   1     2      65   59      23
2   2     2      37   38      45
4   4     1      90   49      87
5   5     2      20   71      34
6   6     3      89   99      46
7   7     1      94   38      87
8   8     2      66   77      95
9   9     3      62   93      43
10 10     1      20   21      76
11 11     2      20   65      23
12 12     3      20   12      94

五、添加

1、添加行

data.frame[新行号,] <- 行值

> df[13,] <- c(13,2,62,19,38) #新增13行数据
> df
   ID Class Chinese Math English
1   1     2      65   59      23
2   2     2      37   38      45
3   3     3      65   76      67
4   4     1      90   49      87
5   5     2      20   71      34
6   6     3      89   99      46
7   7     1      94   38      87
8   8     2      66   77      95
9   9     3      62   93      43
10 10     1      20   21      76
11 11     2      20   65      23
12 12     3      20   12      94
13 13     2      62   19      38

若想对行进行复制,可以采用重复行号的方法

> df <- df[c(1,1:12),]      #复制第1行1次
> df
    ID Class Chinese Math English
1    1     2      65   59      23
1.1  1     2      65   59      23
2    2     2      37   38      45
3    3     3      65   76      67
4    4     1      90   49      87
5    5     2      20   71      34
6    6     3      89   99      46
7    7     1      94   38      87
8    8     2      66   77      95
9    9     3      62   93      43
10  10     1      20   21      76
11  11     2      20   65      23
12  12     3      20   12      94

可使用rep()函数方便进行多行的复制

> df <- df[rep(1:12,each = 2),]     #对每行数据复制1次
> df
     ID Class Chinese Math English
1     1     2      65   59      23
1.1   1     2      65   59      23
2     2     2      37   38      45
2.1   2     2      37   38      45
3     3     3      65   76      67
3.1   3     3      65   76      67
4     4     1      90   49      87
4.1   4     1      90   49      87
5     5     2      20   71      34
5.1   5     2      20   71      34
6     6     3      89   99      46
6.1   6     3      89   99      46
7     7     1      94   38      87
7.1   7     1      94   38      87
8     8     2      66   77      95
8.1   8     2      66   77      95
9     9     3      62   93      43
9.1   9     3      62   93      43
10   10     1      20   21      76
10.1 10     1      20   21      76
11   11     2      20   65      23
11.1 11     2      20   65      23
12   12     3      20   12      94
12.1 12     3      20   12      94

还可采用rbind()函数,后续会有示例

2、添加列

data.frame$新列名 <- 列值

> df$Physics <- c(23,34,67,23,56,67,78,23,54,56,67,34)
> df
   ID Class Chinese Math English Physics
1   1     2      65   59      23      23
2   2     2      37   38      45      34
3   3     3      65   76      67      67
4   4     1      90   49      87      23
5   5     2      20   71      34      56
6   6     3      89   99      46      67
7   7     1      94   38      87      78
8   8     2      66   77      95      23
9   9     3      62   93      43      54
10 10     1      20   21      76      56
11 11     2      20   65      23      67
12 12     3      20   12      94      34

data.frame[,新列号] <- 列值

> df[,7] <- c(1:12)
> df
   ID Class Chinese Math English Physics V7
1   1     2      65   59      23      23     1
2   2     2      37   38      45      34     2
3   3     3      65   76      67      67     3
4   4     1      90   49      87      23     4
5   5     2      20   71      34      56     5
6   6     3      89   99      46      67     6
7   7     1      94   38      87      78     7
8   8     2      66   77      95      23     8
9   9     3      62   93      43      54     9
10 10     1      20   21      76      56    10
11 11     2      20   65      23      67    11
12 12     3      20   12      94      34    12

还可用dplyr包中的mutate()函数

> mutate(df,Chemistry = Chinese + Math + English + Physics)
   ID Class Chinese Math English Physics V7 Chemistry
1   1     2      65   59      23      23      1       170
2   2     2      37   38      45      34      2       154
3   3     3      65   76      67      67      3       275
4   4     1      90   49      87      23      4       249
5   5     2      20   71      34      56      5       181
6   6     3      89   99      46      67      6       301
7   7     1      94   38      87      78      7       297
8   8     2      66   77      95      23      8       261
9   9     3      62   93      43      54      9       252
10 10     1      20   21      76      56     10       173
11 11     2      20   65      23      67     11       175
12 12     3      20   12      94      34     12       160

还可采用cbind()函数,后续会有示例

六、dplyr包常用函数

> df  #原数据
   ID Class Chinese Math English
1   1     2      65   59      23
2   2     2      37   38      45
3   3     3      65   76      67
4   4     1      90   49      87
5   5     2      20   71      34
6   6     3      89   99      46
7   7     1      94   38      87
8   8     2      66   77      95
9   9     3      62   93      43
10 10     1      20   21      76
11 11     2      20   65      23
12 12     3      20   12      94

1、arrange() 排序

arrange(.data, ...)
arrange(.data, ..., .by_group = FALSE)
> arrange(df,Chinese)  #按语文成绩由小到大排序
   ID Class Chinese Math English
1   5     2      20   71      34
2  10     1      20   21      76
3  11     2      20   65      23
4  12     3      20   12      94
5   2     2      37   38      45
6   9     3      62   93      43
7   1     2      65   59      23
8   3     3      65   76      67
9   8     2      66   77      95
10  6     3      89   99      46
11  4     1      90   49      87
12  7     1      94   38      87

函数中第一个是待排序的数据框,之后依次是变量,且变量优先级逐渐降低,如语文、数学成绩进行排序

> arrange(df,Chinese,Math)  #依次按语文、数学成绩由小到大排序
   ID Class Chinese Math English
1  12     3      20   12      94
2  10     1      20   21      76
3  11     2      20   65      23
4   5     2      20   71      34
5   2     2      37   38      45
6   9     3      62   93      43
7   1     2      65   59      23
8   3     3      65   76      67
9   8     2      66   77      95
10  6     3      89   99      46
11  4     1      90   49      87
12  7     1      94   38      87

若想由大到小排序,使用desc()函数

> arrange(df,desc(Chinese))  #按语文成绩由大到小排序
   ID Class Chinese Math English
1   7     1      94   38      87
2   4     1      90   49      87
3   6     3      89   99      46
4   8     2      66   77      95
5   1     2      65   59      23
6   3     3      65   76      67
7   9     3      62   93      43
8   2     2      37   38      45
9   5     2      20   71      34
10 10     1      20   21      76
11 11     2      20   65      23
12 12     3      20   12      94

2、distinct()函数 去重

distinct(.data, ..., .keep_all = FALSE)
> df1 <- df[rep(1:nrow(df),each = 2),] #将df每行复制1次
> df1
     ID Class Chinese Math English
1     1     2      65   59      23
1.1   1     2      65   59      23
2     2     2      37   38      45
2.1   2     2      37   38      45
3     3     3      65   76      67
3.1   3     3      65   76      67
4     4     1      90   49      87
4.1   4     1      90   49      87
5     5     2      20   71      34
5.1   5     2      20   71      34
6     6     3      89   99      46
6.1   6     3      89   99      46
7     7     1      94   38      87
7.1   7     1      94   38      87
8     8     2      66   77      95
8.1   8     2      66   77      95
9     9     3      62   93      43
9.1   9     3      62   93      43
10   10     1      20   21      76
10.1 10     1      20   21      76
11   11     2      20   65      23
11.1 11     2      20   65      23
12   12     3      20   12      94
12.1 12     3      20   12      94
> df1 <- distinct(df1)  #去除重复的行
> df1
   ID Class Chinese Math English
1   1     2      65   59      23
2   2     2      37   38      45
3   3     3      65   76      67
4   4     1      90   49      87
5   5     2      20   71      34
6   6     3      89   99      46
7   7     1      94   38      87
8   8     2      66   77      95
9   9     3      62   93      43
10 10     1      20   21      76
11 11     2      20   65      23
12 12     3      20   12      94

3、group_by()函数 分组 summarise()函数 概括

group_by(.data, ..., add = FALSE, .drop = FALSE)
ungroup(x, ...)
summarise(.data, ...)

group_by()与summarise()函数常连用,用于对不同的分组进行操作,在这里再介绍一个管道函数“%>%”,其作用是把左件的值发送给右件的表达式,并作为右件表达式函数的第一个参数

> df %>%
+   group_by(Class) %>%
+   summarise(max = max(Chinese)) #求出按Class分组每组中语文成绩最高分
# A tibble: 3 x 2
  Class   max
  <dbl> <dbl>
1     1    94
2     2    66
3     3    89

4、filter()函数 筛选

filter(.data, ..., .preserve = FALSE)

选出符合条件的行(返回数据框格式)

> df %>%
+   group_by(Class) %>%
+   filter(Chinese == max(Chinese))  #选出每个班语文成绩最高的学生的信息
# A tibble: 3 x 5
# Groups:   Class [3]
     ID Class Chinese  Math English
  <dbl> <dbl>   <dbl> <dbl>   <dbl>
1     6     3      89    99      46
2     7     1      94    38      87
3     8     2      66    77      95

5、select()函数 选择

select(.data, ...)
> select(df,ID,Chinese,Math,English) #选出df中ID、语文、数学、英语数据
   ID Chinese Math English
1   1      65   59      23
2   2      37   38      45
3   3      65   76      67
4   4      90   49      87
5   5      20   71      34
6   6      89   99      46
7   7      94   38      87
8   8      66   77      95
9   9      62   93      43
10 10      20   21      76
11 11      20   65      23
12 12      20   12      94

6、rbind()函数与cbind()函数 合并

rbind()函数根据行进行合并,cbind()根据列进行合并

#新建数据框df1
> df1 <- data.frame(ID = 13,Class = 2,
Chinese = 65,Math = 26,English = 84)
> df1
  ID Class Chinese Math English
1 13     2      65   26      84
> rbind(df,df1)  #合并df与df1
   ID Class Chinese Math English
1   1     2      65   59      23
2   2     2      37   38      45
3   3     3      65   76      67
4   4     1      90   49      87
5   5     2      20   71      34
6   6     3      89   99      46
7   7     1      94   38      87
8   8     2      66   77      95
9   9     3      62   93      43
10 10     1      20   21      76
11 11     2      20   65      23
12 12     3      20   12      94
13 13     2      65   26      84
> df2 #新建数据框df2
   Biological
1          65
2          15
3          35
4          59
5          64
6          34
7          29
8          46
9          32
10         95
11         46
12         23
> cbind(df,df2)  #合并df与df2
   ID Class Chinese Math English Biological
1   1     2      65   59      23         65
2   2     2      37   38      45         15
3   3     3      65   76      67         35
4   4     1      90   49      87         59
5   5     2      20   71      34         64
6   6     3      89   99      46         34
7   7     1      94   38      87         29
8   8     2      66   77      95         46
9   9     3      62   93      43         32
10 10     1      20   21      76         95
11 11     2      20   65      23         46
12 12     3      20   12      94         23

7、join函数 连接

inner_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"),...)
left_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
right_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"),...)
full_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
semi_join(x, y, by = NULL, copy = FALSE, ...)
nest_join(x, y, by = NULL, copy = FALSE, keep = FALSE, name = NULL,...)
anti_join(x, y, by = NULL, copy = FALSE, ...)

join函数类型比较多,这里仅以left_join()函数举例

#新建数据框Class
> Class <- data.frame(Class = c(1,2,3),class = c('一班','二班','三班'))
> Class
  Class class
1     1  一班
2     2  二班
3     3  三班
> left_join(df,Class,by = 'Class') #基于Class变量左连接df与Class数据框
   ID Class Chinese Math English class
1   1     2      65   59      23    二班
2   2     2      37   38      45    二班
3   3     3      65   76      67    三班
4   4     1      90   49      87    一班
5   5     2      20   71      34    二班
6   6     3      89   99      46    三班
7   7     1      94   38      87    一班
8   8     2      66   77      95    二班
9   9     3      62   93      43    三班
10 10     1      20   21      76    一班
11 11     2      20   65      23    二班
12 12     3      20   12      94    三班

left_join()函数仅保留df对应的Class值的数据

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • R语言 实现data.frame 分组计数、求和等

    df为1个data.frame对象,有stratum和psu两列,这里统计stratum列计数 方法1: cnt = table(df$stratum) 方法2: cnt = tapply(df$psu, INDEX=df$stratum, FUN=length) 在方法2的基础上,只要改变FUN函数就可以实现分组求和.求均值等功能,如下 分组求均值: tapply(df$psu, INDEX=df$stratum, FUN=mean) #(等价于python中的df.groupby('stra

  • R语言 data.frame()命令的使用说明

    同expand.grid() 一样,data.frame() 也是一个生产数据框的命令 不同的是,两者产生的结果,要求不一样 data.frame() 的命令,如 data.frame(x=c(1:4),m=c(10,20,30),n=c(5:16)) x m n 1 1 10 5 2 2 20 6 3 3 30 7 4 4 10 8 5 1 20 9 6 2 30 10 7 3 10 11 8 4 20 12 9 1 30 13 10 2 10 14 11 3 20 15 12 4 30 16

  • R语言中矩阵matrix和数据框data.frame的使用详解

    本文主要介绍了R语言中矩阵matrix和数据框data.frame的一些使用,分享给大家,具体如下: "一,矩阵matrix" "创建向量" x_1=c(1,2,3) x_1=c(1:3) x_2=1:3 typeof(x_1)==typeof(x_2)#查看目标类型 x_3=seq(1,6,length=3)#将1--6分为3个数 a<-rep(1:3,each=3) #1到3依次重复 c<-rep(1:3,times=3) #1到3重复3次 d<

  • R语言中data.frame的常用操作总结

    前言:近段时间学习R语言用到最多的数据格式就是data.frame,现对data.frame常用操作进行总结,其中函数大部分来自dplyr包,该包由Hadley Wickham所作,主要用于数据的清洗和整理. 一.创建 data.frame创建较为容易,调用data.frame函数即可.本文创建一个关于学生成绩的数据框,接下来大部分操作都对该数据框进行,其中学生成绩随机产生 > library(dplyr) #导入dplyr包 > options(digits = 0) #保留整数 >

  • Python中快速掌握Data Frame的常用操作

    掌握Data Frame的常用操作 一. 查看DataFrame的常用属性 DataFrame基础属性有:values(元素).index(索引).columns(列名) .dtypes(类型).size(元素个数).ndim(维度数)和 shape(形状大小尺寸),还有使用T属性 进行转置 import pandas as pd detail=pd.read_excel('E:\data\meal_order_detail.xlsx') #读取数据,使用read_excel 函数调用 # pr

  • 详解R语言中的PCA分析与可视化

    1. 常用术语 (1)标准化(Scale) 如果不对数据进行scale处理,本身数值大的基因对主成分的贡献会大.如果关注的是变量的相对大小对样品分类的贡献,则应SCALE,以防数值高的变量导入的大方差引入的偏见.但是定标(scale)可能会有一些负面效果,因为定标后变量之间的权重就是变得相同.如果我们的变量中有噪音的话,我们就在无形中把噪音和信息的权重变得相同,但PCA本身无法区分信号和噪音.在这样的情形下,我们就不必做定标. (2)特征值 (eigen value) 特征值与特征向量均为矩阵分

  • R语言中的vector(向量),array(数组)使用总结

    对于那些有一点编程经验的人来说,vector,matrix,array,list,data.frame就相当于编程语言中的容器,因为只是将R看做数据处理工具所以它们的底层是靠什么实现的,内存怎么处理的具体也不要深究. R语言很奇怪的是它是面向对象的语言,所以经常会调用系统的方法,而且更奇怪的是总是调用"谓语"的方法,用起来像是写句子一样,记起来真是让人费解.比如is.vector(),read.table(),as.vector().. 直接开始吧:(由于习惯,大部分用"=&

  • R语言中for循环的并行处理方式

    前言 本文用于记录笔者在将R语言中的for语句并行化处理中的一些问题. 实验 这里使用foreach和doParallel包提供的函数实现for语句的并行处理. for语句脚本 func <- function(x, y, z) { return(x^y/z) } # >>> main <<< x <- 2 y <- 3 z <- 1:100000 start <- (proc.time())[3][[1]] a <- 0 for (

  • R语言中cbind、rbind和merge函数的使用与区别

    cbind: 根据列进行合并,即叠加所有列,m列的矩阵与n列的矩阵cbind()最后变成m+n列,合并前提:cbind(a, c)中矩阵a.c的行数必需相符 rbind: 根据行进行合并,就是行的叠加,m行的矩阵与n行的矩阵rbind()最后变成m+n行,合并前提:rbind(a, c)中矩阵a.c的列数必需相符 > a <- matrix(1:12, 3, 4) > print(a) [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,

  • R语言中Fisher判别的使用方法

    最近编写了Fisher判别的相关代码时,需要与已有软件比照结果以确定自己代码的正确性,于是找到了安装方便且免费的R.这里把R中进行Fisher判别的方法记录下来. 1. 判别分析与Fisher判别 不严谨但是通俗的说法,判别分析(Discriminant Analysis)是一种多元(多个变量)统计分析方法,它根据样本的多个已知变量的值对样本进行分类的方法.一般来说,判别分析由两个阶段构成--学习(训练)和判别.在学习阶段,给定一批已经被分类好的样本,根据它们的分类情况和样本的多个变量的值来学习

  • R语言中cut()函数的用法说明

    R语言cut()函数使用 cut()切割将x的范围划分为时间间隔,并根据其所处的时间间隔对x中的值进行编码. 参数:breaks:两个或更多个唯一切割点或单个数字(大于或等于2)的数字向量,给出x被切割的间隔的个数. breaks采用fivenum():返回五个数据:最小值.下四分位数.中位数.上四分位数.最大值. labels为区间数,打标签 ordered_result 逻辑结果应该是一个有序的因素吗? 先用fivenum求出5个数,再用labels为每两个数之间,贴标签,采用(]的区间,

  • R语言中merge函数详解

    1.创建测试数据: name <- c('A','B','A','A','C','D') school <- c('s1','s2','s1','s1','s1','s3') class <- c(10, 5, 4, 11, 1, 8) English <- c(85, 50, 90 ,90, 12, 96) w <- data.frame(name, school, class, English) w name <- c('A','B','C','F') school

  • R语言中ggplot2绘制双坐标轴图

    R包ggplot2绘图精美,可以做出很复杂的图形,深受用户喜爱.它的作者hadley并不推荐使用ggplot2绘制双坐标轴图,认为这样会增加读图的难度,但是目前需要双坐标轴图应用的场景还是很多,如下图形直方图和曲线分别有不同的坐标轴,表示不同的意思,图片展示内容比较丰富 今天我们通过我们的汽车销售数据(公众号回复:汽车销售,可以获得数据)来演示一下ggplot2绘制双坐标轴图,主要是通过sec.axis函数进行转换,进行第二个坐标轴的转换.我们先来导入数据 library(foreign) li

随机推荐