我正在处理一个具有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
... ... ... ... ...
尝试从这两个帖子中转移某些技术未成功
我想知道是否还有其他资源或原始见解可能会有所帮助。这两篇文章中的方法似乎仅在行数相等的数据帧之间进行匹配和条件替换时才有效。
答案 0 :(得分:0)
有3种方法。
使用合并功能(本机)
在dplyr中使用合并
使用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