如何合并整洁的数据集并合并列

时间:2019-09-24 08:13:49

标签: r join dplyr tidyverse tibble

我有两个整洁的小标题,其中一个匹配的键列(ID),而几个列的名称相同,但行值不同。 我想按ID将两个小标题合并,并将其他测量,时间戳和df2的值添加到df1的相应列中。

到目前为止,我已经尝试过full_join,merge,left_join等:

joined_df <- full_join(df1, df2, by="ID")

但是这将返回带有附加时间,值和度量值列(time.x,value.x等)的小标题。

但是,

I希望通过ID将那些额外的df2值添加到df1的现有列中,以使生成的df添加了行,但没有添加列。

这是一个例子:

df1 <- data.frame(ID = c(1, 2, 3, 4, 1, 2, 3, 4), 
                  time = c(1,2,3,4,5,6,7,8), 
                  value = c(1, 2, 3, 4, 5, 6, 7, 8)
                  measurement = c(x,s,d,g,u,b,z,e)
                  xy = c(g,h,j,k,t,d,g,t)
df2 <- data.frame(ID = c(1, 2, 3, 4, 1, 2, 3, 4), 
                  time = c(11,12,13,14,15,16,17,18), 
                  value = c(8, 7, 6, 5, 4, 3, 2, 1),
                  measurement = c(r,t,z,u,i,o,k,f)
                  ab = c(j,k,o,l,p,f,b,c)

我需要一个联接函数,该函数将df2中添加的行数扩展到ID列,并包括从df2到df1的现有列的​​其他度量,值和时间戳。 预期的输出将是:

df3 <- data.frame(ID = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4), 
                  time = c(1,2,3,4,5,6,7,8,11,12,13,14,15,16,17,18), 
                  value = c(1, 2, 3, 4, 5, 6, 7, 8, 8, 7, 6, 5, 4, 3, 2, 1)
                  measurement = c(x,s,d,g,u,b,z,e,r,t,z,u,i,o,k,f)
                  xy = c(g,h,j,k,t,d,g,t,g,h,j,k,t,d,g,t)
                  ab = c(j,k,o,l,p,f,b,c,j,k,o,l,p,f,b,c))

我无法找到某物。像那样提前非常感谢您!

2 个答案:

答案 0 :(得分:0)

add_missing_columns <- function(from, to) {
  to[setdiff(names(from), names(to))] <- from[setdiff(names(from), names(to))]
  to
}
df2 <- add_missing_columns(from = df1, to = df2)
df1 <- add_missing_columns(from = df2, to = df1)
res <- rbind(df1, df2)
all.equal(df3, res)
# TRUE

有数据:

df1 <- data.frame(ID = c(1, 2, 3, 4, 1, 2, 3, 4), 
                  time = c(1,2,3,4,5,6,7,8), 
                  value = c(1, 2, 3, 4, 5, 6, 7, 8),
                  measurement = c(
                     "x", "s", "d", "g", "u", "b", "z", "e"),
                  xy = c(
                     "g", "h", "j", "k", "t", "d", "g", "t"),
                  stringsAsFactors = FALSE)

df2 <- data.frame(ID = c(1, 2, 3, 4, 1, 2, 3, 4), 
                  time = c(11,12,13,14,15,16,17,18), 
                  value = c(8, 7, 6, 5, 4, 3, 2, 1),
                  measurement = c(
                     "r", "t", "z", "u", "i", "o", "k", "f"),
                  ab = c(
                     "j", "k", "o", "l", "p", "f", "b", "c"),
                  stringsAsFactors = FALSE)

df3 <- data.frame(ID = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4), 
                  time = c(1,2,3,4,5,6,7,8,11,12,13,14,15,16,17,18), 
                  value = c(1, 2, 3, 4, 5, 6, 7, 8, 8, 7, 6, 5, 4, 3, 2, 1),
                  measurement = c(
                     "x", "s", "d", "g", "u", "b", "z", "e", "r", "t", "z", "u", "i", "o", "k", "f"),
                  xy = c(
                     "g", "h", "j", "k", "t", "d", "g", "t", "g", "h", "j", "k", "t", "d", "g", "t"),
                  ab = c(
                     "j", "k", "o", "l", "p", "f", "b", "c", "j", "k", "o", "l", "p", "f", "b", "c"),
                  stringsAsFactors = FALSE)

答案 1 :(得分:0)

我现在设法通过结合使用bind_rows和left_join来解决它:

df3 <- bind_rows(df1[,c(2,3,5,6)], df2[,c(1,3,4,5)])

df1_lookup <- 
  df1 %>% select(ID,xy,cv) %>% distinct()

df2_lookup <- 
  df2 %>% select(ID,ab) %>% distinct()

df3 %>% left_join(df1_lookup, by="ID") %>% left_join(df2_lookup, by="ID")

谢谢!

相关问题