我有一个数据框,其中包含有关来自不同树的直径测量值的信息(列" 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)的功能,但我无法找到解决方案。
答案 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)