刘p7557pnygqhy / R语言 / R语言 | 第六讲:R语言数据管理(二)

分享

   

R语言 | 第六讲:R语言数据管理(二)

2018-10-12  刘p7557pn...

撰稿人:统计小可爱,爱笑的人运气不会太差


在统计分析过程中,如果数据分散在多个数据集,我们在进行下一步的时候就需要将其进行拼接合并。

 数据合并

01

横向合并

1. cbind{base}

直接横向合并两个矩阵或数据框,并不需要制定一个公共索引,可使用cbind函数:

cbind (A, B)

该函数将横向合并对象A对象B,为了能够正常工作,每个对象必须拥有相同的行数,以相同顺序排序


例1:假设有a,b,c三个矩阵,其中矩阵a和矩阵b有3行数据,矩阵c有4行数据。我们将对矩阵a和矩阵b,矩阵a和矩阵c进行横向合并,结果如下:

a <- matrix(1:12, 3, 4)  

b <- matrix(-1:-12, 3, 4)

c <- matrix(-1:-20, 4, 5)

x1 <- cbind(a,b) #a和b合并成功

x2 <- cbind(a,c) #系统报错

Error in cbind(a, c) : number of rows of matrices must match (see arg 2)


2. bind_cols{dplyr}

bind_cols( )函数在dplyr包中,可以进行横向合并的函数,同样要求合并数据框行数相同

bind_cols(A, B)

02

纵向合并

1. rbind{base}

纵向合并两个数据框(数据集),可使用rbind( )函数:

rbind(A, B)

两个数据框必须拥有相同的变量,不过它们的顺序不必一定相同。如果对象A中拥有对象B中没有的变量,需要在合并前删除对象A中的多余变量,或者对象B中创建追加的变量并将其值设为NA(缺失)。


例2:我们将对例1的矩阵a和矩阵b,矩阵a和矩阵c进行纵向合并,结果如下:

y1 <- rbind(a,b) #a和b合并成功

y2 <- rbind(a,c) #系统报错

Error in rbind(a, c) : number of columns of matrices must match (see arg 2)


2. bind_rows{dplyr}

bind_rows( )函数不要求字段名称必须相同,函数会自己做判断,把对象A中拥有而对象B中没有的变量,用NA值表示:

bind_rows(A, B)


例3:假设我们要对data1和data2这两个数据框进行合并。

data1<-data.frame(nameA=c ('Emma', 'Mia', 'Zoe', 'Coden'),value=c(34, 52, 36, 18))

data2<-data.frame(nameB=c ('Jackson', 'Lucas', 'Logan', 'Ellen'), value=c(45, 31, 22, 19)) 

bind_rows(data1,data2)

 数据连接

01

merge

横向合并两个数据框(数据集),使用merge( )函数。多数情况下,两个数据框是通过一个或多个共有变量进行联结的。

merge (datax,datay,by= ,all= ,all.x= ,all.y= incomparables= )

by=:指定连接的字段;

all=:TRUE(全连接)或者FALSE(内连接)决定是否保留相同ID字段,还是连接保留ID所有字段;

all.x=:TRUE(左连接)通过第一个数据框进行连接,即保留第一个数据框对应ID值;

all.y=:TRUE(右连接)通过第二个数据框进行连接,即保留第二个数据框对应ID值;

incomparables=:合并中不考虑的匹配值。


例4假设我们要对xy这两个数据框进行匹配,连接的变量为k1

x <- data.frame(k1 = c(NA,NA,3,4,5), k2 = c(1,NA,NA,4,5), data = 1:5) 

y <- data.frame(k1 = c(NA,2,NA,4,5), k2 = c(NA,NA,3,4,5), data = 1:5)

merge(x, y, by = 'k1') #这里x和y两个数据框的k1变量均有两个缺失(NA)。这样在匹配过程中,x每条k1缺失的观测都会跟y的2条k1缺失的观测匹配到。

merge(x, y, by = 'k2', incomparables = NA) #通过设置“incomparables = NA”来让缺失的观测不进行匹配。


例5:下面举例介绍内连接,全连接,左连接和右连接。假设要对数据集table1和table2进行匹配,连接的变量为ID。

table1<-data.frame(Id=c(1, 2, 3), sex=c('女', '男', '男'))

table2<-data.frame(Id=c(1, 2, 4), age=c(22, 17, 33)) 

#内连接,在每个表中找出符合条件的共有记录。

merge(table1,table2,by='Id',all=FALSE)

#全连接,返回符合条件的所有表的记录,没有与之匹配的,用NA表示(结果是左连接和右连接的并集)

merge(table1,table2,by='Id',all=TRUE)

#左连接,根据左表的记录,在被连接的右表中找出符合条件的记录与之匹配,如果找不到与左表匹配的,用NA表示。

merge(table1,table2,by='Id',all.x=TRUE)

#右连接,根据右表的记录,在被连接的左表中找出符合条件的记录与之匹配,如果找不到匹配的,用NA填充。

merge(table1,table2,by='Id',all.y=TRUE)

02

dplyr包的连接函数

dplyr包也提供了数据连接的函数:

#内连接

inner_join(table1,table2,by='Id')

#全连接

full_join(table1,table2,by='Id')

#左连接

left_join(table1,table2,by='Id') 

#右连接 

right_join(table1,table2,by='Id')


以上就是今天讲的内容,顺便吐槽下另一位作者的笔名


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多

    ×
    ×

    ¥.00

    微信或支付宝扫码支付:

    开通即同意《个图VIP服务协议》

    全部>>