这段时间在清洗自己的三年的横断面数据,需要进行数据的合并连接。发现tidyverse非常不错。
以下是一些很常用的合并方法(备份一下,下次直接复制去用):
####直接合并行/列####
#合并行:在下方堆叠新行,根据列名合并,注意列名要相同,否则会作为新列(用NA填充)
#合并列:在右侧拼接新列,根据位置匹配行,数据框的行数必须相同
#合并行/列在R中分别用dplyr包中的bind_rows()和bind_cols()函数实现
library(dplyr)
bind_rows(
sample_n(iris, 2), #随机抽取2个样本(行)
sample_n(iris, 2),
sample_n(iris, 2)
)
one = mtcars[1:4, 1:3]
tow = mtcars[1:4, 4:5]
bind_cols(one, tow)
####按照匹配值合并数据框####
#主要包括以下几种情况:
#外连接(左连接、右连接、全连接)、内连接、半连接、反连接;这六种连接对应六个接口一致的函数
left_join(x, y, by)
right_join(x, y, by)
full_join(x, y, by)
inner_join(x, y, by)
semi_join(x, y, by)
anti_join(x, y, by)
#下面用dplyr自带的两个数据集演示
band = band_members
instrument = band_instruments
#左连接:保留x的所有行,合并匹配y中的列
band %>%
left_join(instrument, by = "name")
#右连接:保留y的所有行,合并匹配x中的列
band %>%
right_join(instrument, by = "name")
#全连接:保留x和y中所有的行,合并匹配列
band %>%
full_join(instrument, by = "name")
#内连接:保留两个数据表中共有的观测(行)
band %>%
inner_join(instrument, by = "name")
#半连接:保留x表中与y表中的行相匹配的所有行,即根据y表中有匹配的部分来筛选x表中的行
band %>%
semi_join(instrument, by = "name")
#反连接:删掉x表中与y表中的行相匹配的所有行,即更具y表中没有匹配的部分筛选x表中的行
band %>%
anti_join(instrument, by = "name")
####集合运算####
intersect(x, y) #返回x和y共同包含的观测(行)
union(x, y) #返回x和y中所有的(唯一)观测
setdiff(x, y) #返回在x中但不在y中的观测
setequal(x, y) #判断集合x和y是否相等
详细内容大家可以参考张敬信老师的《R语言编程——基于tidyverse》