R-基于匹配标识符的不同长度的数据帧之间的插入行

时间:2019-10-12 03:34:45

标签: r data-cleaning

我正在处理一个具有7000多个观察值的数据框,其中为每个受访者分配了一个标识其地理位置的数值。

#DF 1

USER_ID   Col2   ...   NumIdentifier
  45        4                101
  12        9                98
  97        19               7
  11        3                104
  54        1                109
  2         23               110
  ...       ...              ...

现在,我已经获得了一些附加信息(Var1,Var2),这些信息仅需要基于此数字地理标识符分配给某些受访者。

#DF 2

NumIdentifer   Var1   Var2
   101          13     20
   104          16     87
   109          34     21
   ...         ...     ...

'DF 2'每个数字地理标识符包含一行,并且包含的​​地理标识符子集比'DF 1'中的子集小。 “ DF 2”中大约有30行。

首先,我从“ DF 1”构建了一个新的数据框,其中仅包含在“ DF 2”中具有数字标识符的受访者。

#DF 3
USER_ID   Col2   ...   NumIdentifier
  45        4                101
  11        3                104
  54        1                109
  ...       ...              ...

我想要的理想输出看起来像这样。如果“ DF 2”中的数字标识符等于“ DF 3”中的数字标识符,则将插入每个对应行的Var1和Var2。

#DF 3
USER_ID   Col2   ...   NumIdentifier   Var1   Var2
  45        4                101        13     20
  11        3                104        16     87
  54        1                109        34     21
  ...       ...              ...        ...   ...

尝试从这两个帖子中转移某些技术未成功

  • “ r-匹配两个数据帧,并根据情况从一个插入另一个的行”
  • “ R-根据两个匹配条件替换数据框中的值”

我想知道是否还有其他资源或原始见解可能会有所帮助。这两篇文章中的方法似乎仅在行数相等的数据帧之间进行匹配和条件替换时才有效。

1 个答案:

答案 0 :(得分:0)

有3种方法。

  1. 使用合并功能(本机)

  2. 在dplyr中使用合并

  3. 使用sqldf库

我的偏好是native / dplyr,因为sqldf实际上会将您的数据帧转换为SQLite数据库,因此需要额外的内存。

> df1 <- data.frame("NumIdentifier" = c(101,98,7,104,109,11), "USER_ID" = c(45,12,97,11,54,2), "Col2" = c(4,9,19,3,1,23))
> df1
  NumIdentifier USER_ID Col2
1           101      45    4
2            98      12    9
3             7      97   19
4           104      11    3
5           109      54    1
6            11       2   23

> df2 <- data.frame("NumIdentifier" = c(101,104,109), "Var1" = c(13,16,34), "Var2" = c(20,87,21))

> df2
  NumIdentifier Var1 Var2
1           101   13   20
2           104   16   87
3           109   34   21

dplyr中的

Merge()函数

df3 <- merge(x = df1, y = df2, by = "NumIdentifier", all.y = TRUE)
> df3
  NumIdentifier USER_ID Col2 Var1 Var2
1           101      45    4   13   20
2           104      11    3   16   87
3           109      54    1   34   21

sqldf

> library(sqldf)
> df4 <- sqldf("SELECT * FROM df2 LEFT JOIN df1 USING(NumIdentifier)")
> df4
  NumIdentifier Var1 Var2 USER_ID Col2
1           101   13   20      45    4
2           104   16   87      11    3
3           109   34   21      54    1