数据-R语言-图表-决策-Linux-Python

R核心技术手册笔记(4 数据的存取和编辑)

2019-04-07  本文已影响80人  Thinkando

1. 文件导入

2. 导出数据

3. 合并数据

  1. paste 将多个字符型向量连接成一个向量,默认情况用空格分隔


    image.png
  2. cbind 按列合,增加列
  3. rbind 按行合,增加行

4. 通过共同字段合并数据

> id1 <- c(2, 3, 4, 5, 7)
> heights <- c(62, 65, 71, 71, 67)
> df1 <- data.frame(id = id1, heights)

> id2 <- c(1, 2, 6:10)
> weights <- c(147, 113, 168, 135, 142, 159, 160)
> df2 <- data.frame(id = id2, weights)

# all=FALSE,取交集
> merge(df1, df2, all = FALSE)
  id heights weights
1  2      62     113
2  7      67     135
> intersect(df1$id, df2$id)
[1] 2 7

# 取合集
> merge(df1, df2, by = "id", all = TRUE)
   id heights weights
1   1      NA     147
2   2      62     113
3   3      65      NA
4   4      71      NA
5   5      71      NA
6   6      NA     168
7   7      67     135
8   8      NA     142
9   9      NA     159
10 10      NA     160

# all.x 指df1, all.y 指df2
> merge(df1, df2, by = "id", all.x = TRUE)
  id heights weights
1  2      62     113
2  3      65      NA
3  4      71      NA
4  5      71      NA
5  7      67     135

# 想合并的index 大于两列
> df1$sex <- c("f", "m", "f", "f", "m")
> df2$sex <- c("f", "f", "m", "m", "f", "f", "f")
> merge(df1, df2)
  id sex heights weights
1  2   f      62     113
2  7   m      67     135
> merge(df1, df2, by = c("id", "sex"))
  id sex heights weights
1  2   f      62     113
2  7   m      67     135
> merge(df1, df2, by = "id")
  id heights sex.x weights sex.y
1  2      62     f     113     f
2  7      67     m     135     m

5. 数据转换

ID=c(11,12,13)
Name=c("Devin","Edward","Wenli")
Gender=c("M","M","F")
Birthdate=c("1984-12-29","1983-5-6","1986-8-8")
student<-data.frame(ID,Name,Gender,Birthdate)

> student
  ID   Name Gender  Birthdate
1 11  Devin      M 1984-12-29
2 12 Edward      M   1983-5-6
3 13  Wenli      F   1986-8-8

row.names(student)<-student$ID # 建立行索引
student[1,] # 访问第一行
student[,2] # 访问第二列

idname<-student[1:2]  == idname<-student[c("ID","Name”)] # 访问两列

student[[2]] == student[["Name"]] == student$Name  # 访问name
# 同上
with(student,{
  n<-Name
  print(n)
})

# 改变向量类型
student$Name<-as.character(student$Name)
student$Birthdate<-as.Date(student$Birthdate)

# 增加一列
student$Age<-as.integer(format(Sys.Date(),"%Y"))-as.integer(format(student$Birthdate,"%Y”))

# 索引, 小括号里面返回逻辑变量,which true的指针
student[which(student$Gender=="F"),]
# 索引女性年龄
student[which(student$Gender=="F"),"Age”]
# subset 函数查询
subset(student,Gender=="F" & Age<30 ,select=c("Name","Age"))

5 转换函数

  1. transform 函数
用法: transform(‘data’,….)

data就是要修改的data,  '…..'代表你要进行的修改

e.g 

1:transform(airquality, new.col = Wind^2)  

#添加列new.col,每项的值为Wind中每项值的平方

2: transform(airquality,Wind=NULL)

# 删除原数据集中的Wind列

3: transform(airquality,Wind=Month+Day)

#将原数据集中Wind列的数据改成Month列+Day列的值


## 同样的,上面的3步可以放在一起进行,即在一个括号里,依次写就好了

## 注意,transform只能用于修改data.frame类型

## airquality为R中自带的数据集

# transform可以用within函数代替,因为within还可以用在不是数据框格式的内容
里,上面的例子可以用within改写:

within(airquality,{new.col=Wind^2;rm(Wind);Wind=Wind^2})

#这里需要注意的是大括号里不同的任务要用分好";"隔开,不能用逗号,后者就

是两个任务在两行中,rm(变量名)和变量名=NULL是等价的,都是删除该列
  1. apply 函数
> x<-1:20
> dim(x)<-c(5,4)
> x
     [,1] [,2] [,3] [,4]
[1,]    1    6   11   16
[2,]    2    7   12   17
[3,]    3    8   13   18
[4,]    4    9   14   19
[5,]    5   10   15   20
> apply(X=x, MARGIN=1,FUN=max) # 看第一行最大的数
[1] 16 17 18 19 20

x<-1:27
dim(x)<-c(3,3,3)
apply(X=x,MARGIN=1,FUN=paste,collapse=",") # 第一行粘贴
  1. lapply 函数允许在列表或者向量的每一个元素运行某个函数,并返回一个列表
> x<- as.list(1:5)
> lapply(x,function(x) 2^x)
[[1]]
[1] 2

[[2]]
[1] 4

[[3]]
[1] 8

[[4]]
[1] 16

[[5]]
[1] 32

> sapply(x,function(x) 2^x) # 返回一个向量或者矩阵
[1]  2  4  8 16 32

6. plyr 包

image.png
image.png
image.png
image.png

7 数据分段

image.png
image.png
image.png
上一篇 下一篇

猜你喜欢

热点阅读