R:通过键变量绑定列

Posted

技术标签:

【中文标题】R:通过键变量绑定列【英文标题】:R: Binding columns by key variable 【发布时间】:2018-08-15 23:57:40 【问题描述】:

我想将df1df2 这两个数据框按x1 中的关键变量的不同组组合起来。它基本上是一些连接操作,但是,我不希望行重复,也不关心添加的列之间的关系。

假设:

df1

x1 x2 
A  1
A  2
A  3
B  4
B  5
C  6
C  7

df2

x1 x3 
A  a
A  b
A  c
A  d
A  e
A  f
B  g
C  h

结果应该是这样的。

df1 + df2

x1 x2 x3 
A  1  a
A  2  b
A  3  c
A  NA d
A  NA f
B  4  g
B  5  NA
C  6  h
C  7  NA

有人有想法吗?非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

dplyr 中的 full_join 也适用于此。见下文:

  #recreate your data
  library (data.table)
  library (dplyr)

  df1 <- data.table (x1 = c("A","A","A","B","B","C","C"), x2 = seq (from = 1, to = 7))

  df2 <- data.table (x1 = c("A","A","A","A","A","A","B","C"), x3 = c("a","b","c","d","e","f","g","h" ))

  df1[, rowid := rowid(x1)]

  df2[, rowid := rowid(x1)]

  df3 <- full_join (df1, df2, by = c ("x1","rowid"))

  df3$rowid <- NULL

  setorder (df3, x1)

【讨论】:

【参考方案2】:

要复制生成的data.frame,您可以通过x1 创建行ID,然后合并这些行ID 和x1(但我真的不知道这是否是您想要完成的)

library(data.table)

df1 = read.table(text = "x1 x2 
A  1
A  2
A  3
B  4
B  5
C  6
C  7", header = T)

df2 = read.table(text = "x1 x3 
A  a
A  b
A  c
A  d
A  e
A  f
B  g
C  h", header = T)

setDT(df1) 
setDT(df2)
df1[, rowid := seq(.N), by = x1] # create rowid
df2[, rowid := seq(.N), by = x1] # create rowid

merge(df1, df2, by = c("x1", "rowid"), all = T)[, rowid := NULL][]

    x1 x2 x3
 1:  A  1  a
 2:  A  2  b
 3:  A  3  c
 4:  A NA  d
 5:  A NA  e
 6:  A NA  f
 7:  B  4  g
 8:  B  5 NA
 9:  C  6  h
10:  C  7 NA

【讨论】:

仅供参考,有一个功能:df1[, rowid := rowid(x1)] 非常感谢,这太棒了!

以上是关于R:通过键变量绑定列的主要内容,如果未能解决你的问题,请参考以下文章

R编写函数将列绑定到数据框

通过最大化 R data.table 中增加虚拟变量(列)分组的流行度来创建 CDF

带有 vim 键绑定和方法/变量完成的 Node.js REPL

R语言使用table1包绘制(生成)三线表使用单变量分列构建三线表编写自定义函数通过t检验为三线表添加p值列设置不显示overall数值

三线表是什么?R语言使用table1包绘制(生成)三线表使用单变量分列构建三线表通过topclass参数自定义三线表表格的显示形式(显示为类似斑马线并将所有列居中,包括包含行标签的第一列)

R - 获取数据库列列表的函数