将两个数据帧与共享列组合并填充NA

时间:2015-04-14 10:21:56

标签: r merge dataframe dplyr

我有一个数据框,其中包含有关来自不同树的直径测量值的信息(列" t"),每个树具有不同数量的茎(列" s1和#34;)。在第一个记录中,记录所有活动的词干(列" flag1"),产生以下数据框:

DF1

t   s1  d1  flag1
t1  a   2   alive
t1  b   3   alive
t1  c   2   alive
t2  a   4   alive
t2  b   3   alive
t2  c   7   alive
t3  a   3   alive
t3  b   5   alive
t4  a   4   alive
t4  b   3   alive

随着树木每年生长,每棵树再次记录相同的茎直径,生成具有新直径测量值的新数据框(df2)。此外,在接下来的几年中,树木的茎可能活着(例如" t3"),获得新的茎(例如" t2"),失去茎(例如" t1&# 34;)或所有这些组合(例如" t4"):

DF2

t   s2  d2  flag2
t1  a   3   alive
t1  b   4   alive
t1  c   NA  dead
t2  a   5   alive
t2  b   3   alive
t2  c   7   alive
t2  d   3   new
t2  e   4   new
t3  a   4   alive
t3  b   8   alive
t4  a   5   alive
t4  b   NA  dead
t4  c   3   new

我需要创建一个带有共享列的新数据框(" t"),同时保留每个数据帧的剩余列,并用NA填充空单元格。在这种情况下,最终的数据框将是这样的:

DF3

t   s1  d1  flag1   s2  d2  flag2
t1  a   2   alive   a   3   alive
t1  b   3   alive   b   4   alive
t1  c   2   alive   c   NA  dead
t2  a   4   alive   a   5   alive
t2  b   3   alive   b   3   alive
t2  c   7   alive   c   7   alive
t2  NA  NA  NA      d   3   new
t2  NA  NA  NA      e   4   new
t3  a   3   alive   a   4   alive
t3  b   5   alive   b   8   alive
t4  a   4   alive   a   5   alive
t4  b   3   alive   b   NA  dead
t4  NA  NA  NA      c   3   new

我尝试了类似cbind.fill(package:rowr)的功能,但我无法找到解决方案。

1 个答案:

答案 0 :(得分:1)

这是一个dplyr - 解决方案,或更好:hack。

zz1 <- "t   s1  d1  flag1
t1  a   2   alive
t1  b   3   alive
t1  c   2   alive
t2  a   4   alive
t2  b   3   alive
t2  c   7   alive
t3  a   3   alive
t3  b   5   alive
t4  a   4   alive
t4  b   3   alive"
df1 <- read.table(text = zz1, header = T)
zz2 <- "t   s2  d2  flag2
t1  a   3   alive
t1  b   4   alive
t1  c   NA  dead
t2  a   5   alive
t2  b   3   alive
t2  c   7   alive
t2  d   3   new
t2  e   4   new
t3  a   4   alive
t3  b   8   alive
t4  a   5   alive
t4  b   NA  dead
t4  c   3   new"
df2 <- read.table(text = zz2, header = T)

# dummy data frame w/o new flags
df2_a <- dplyr::filter(df2, flag2 != "new")
# bind columns
df3 <- dplyr::bind_cols(df1, df2_a)
# add new flags and sort by "t"
df3 <- dplyr::bind_rows(df3, dplyr::filter(df2, flag2 == "new")) %>% dplyr::arrange(t)