我有两个数据帧,结构如下 数据库称为“笔记”
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()没有成功),只是不确定要查找的函数。有帮助吗? 干杯 马可
答案 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"]
非常感谢! 马可