【问题标题】:How to join tidy datasets and merge the columns如何加入整洁的数据集并合并列
【发布时间】:2019-09-24 08:13:49
【问题描述】:

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

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

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

但这会返回一个带有额外时间、值和测量列(time.x、value.x 等)的小标题。

但是,我想将这些额外的 df2 值按 ID 添加到 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))

不知怎的,我无法找到某事。还是那样。非常感谢您!

【问题讨论】:

  • 试试dplyr::bind_rows(df1, df2)
  • 是的,这是真的,但问题是我在两个 dfs 中还有其他列(忘记在示例中添加它们,抱歉),我想按 ID 添加。所以基本上(这里)“xy”和“ab”列应该按ID添加,“测量”和“值”列应该扩展。
  • 在合并时为这两个数据帧提供预期的输出。
  • 我做到了(df3)。我尝试绑定行,然后通过 fieldId 仅对每个数据帧的附加列进行 full_join,但这使我的 R 崩溃 O.o

标签: r join dplyr tidyverse tibble


【解决方案1】:

我现在通过结合使用 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")

谢谢!

【讨论】:

    【解决方案2】:
    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)
    

    【讨论】:

    • 谢谢!但是,这不会只是将每个 df 的缺失列绑定到另一个而不考虑 fieldId 作为连接的唯一键吗?
    • 预期在生成的“加入”中会找到什么(这将使其成为加入,而不是联合)?
    猜你喜欢
    • 1970-01-01
    • 2017-09-17
    • 2022-11-10
    • 2010-10-02
    • 2011-04-03
    • 2020-08-26
    • 2019-06-20
    • 1970-01-01
    • 2012-11-15
    相关资源
    最近更新 更多