在R中的列之间匹配信息

时间:2014-02-12 11:44:20

标签: r

我有两个数据帧,结构如下 数据库称为“笔记”

id   breed   gender   date        text
1    NA      NA       01/01/2000  fdsgkefge
1    NA      NA       01/02/2001  glerlefde
2    NA      NA       02/01/2000  ddubgui
2    NA      NA       02/01/2000  sdfsfbfb
1    NA      NA       02/03/2002  geherhwt
3    NA      NA       10/10/2003  dggqgeqgr
4    NA      NA       21/07/2003  ssihiqgho

具有人口统计信息“demo”的数据库

id   breed  gender
1    A      M
2    B      F
3    B      M
4    C      M

我想要最终的datafrane如下:

id  breed   gender  date        text
1   A       M      01/01/2000   fdsgkefge
1   A       M      01/02/2001   glerlefde
2   B       F      02/01/2000   ddubgui
2   B       F      02/01/2000   sdfsfbfb
1   A       M      02/03/2002   geherhwt
3   B       M      10/10/2003   dggqgeqgr
4   C       M      21/07/2003   ssihiqgho

我写的这段代码不起作用:

for(i in 1:length(practice)){
  notes$breed[i]<-demo$breed[demo$id==notes$id[i]],
  notes$gender[i]<-demo$gender[demo$id==notes$id[i]]
}

也许循环在这里不是一个好主意,我确信必须有一个函数可以对此进行排序(尝试match()没有成功),只是不确定要查找的函数。有帮助吗? 干杯 马可

2 个答案:

答案 0 :(得分:2)

如果行和列顺序无关紧要,以下是一些性能不同的选项:

merge(x=notes[, c("id", "date", "text")], y=demo, by="id")
#   id       date      text breed gender
# 1  1 01/01/2000 fdsgkefge     A      M
# 2  1 01/02/2001 glerlefde     A      M
# 3  1 02/03/2002  geherhwt     A      M
# 4  2 02/01/2000   ddubgui     B      F
# 5  2 02/01/2000  sdfsfbfb     B      F
# 6  3 10/10/2003 dggqgeqgr     B      M
# 7  4 21/07/2003 ssihiqgho     C      M

library(dplyr)
left_join(notes[, c("id", "date", "text")], demo)
#   id       date      text gender breed
# 1  1 01/01/2000 fdsgkefge      M     A
# 2  1 01/02/2001 glerlefde      M     A
# 3  2 02/01/2000   ddubgui      F     B
# 4  2 02/01/2000  sdfsfbfb      F     B
# 5  1 02/03/2002  geherhwt      M     A
# 6  3 10/10/2003 dggqgeqgr      M     B
# 7  4 21/07/2003 ssihiqgho      M     C

library(data.table)
demo.dt <- data.table(demo, key="id")
notes.dt <- data.table(notes[, c("id", "date", "text")])
demo.dt[notes.dt]
#    id breed gender       date      text
# 1:  1     A      M 01/01/2000 fdsgkefge
# 2:  1     A      M 01/02/2001 glerlefde
# 3:  2     B      F 02/01/2000   ddubgui
# 4:  2     B      F 02/01/2000  sdfsfbfb
# 5:  1     A      M 02/03/2002  geherhwt
# 6:  3     B      M 10/10/2003 dggqgeqgr
# 7:  4     C      M 21/07/2003 ssihiqgho 

答案 1 :(得分:1)

非常感谢,我在工作中也得到了一些帮助(尽管合并选项看起来最简单)所以我想我也加入了这个也是为了完整性

notes[,"breed"] <- demo[notes[,"id"],"breed"]
notes[,"gender"] <- demo[notes[,"id"],"gender"]

非常感谢! 马可