r - 基于一列合并两个数据框而不重复行并保留更多数据
问题描述
我的目标是基于 column 合并两个大型数据框genus
,但具有不重复行的特殊条件(第一次尝试未解决);并且还保留来自两个数据帧的更多信息(在第二次尝试中未解决),请参阅所需的输出:
chromdata <- read.table(text="
genus sp
1 Acosta Acosta_1
2 Aguilera Aguilera_1
3 Acosta Acosta_2
4 Aguilera Aguilera_2
5 other 1 # EDIT: new rows
6 other 2",header=TRUE,fill=TRUE,stringsAsFactors=FALSE)
treedata <- read.table(text="
genus sp
1 Acosta Acosta_3
2 Aguilera Aguilera_3
3 Acosta Acosta_4
4 Aguilera Aguilera_4
5 other 3",header=TRUE,fill=TRUE,stringsAsFactors=FALSE)
#First try
merge(chromdata,treedata, by="genus", all=F)
#Second try
chromdata$sp2<-treedata$sp[match(chromdata$genus, treedata$genus)]
chromdata
genus sp sp2
1 Acosta Acosta_1 Acosta_3
2 Aguilera Aguilera_1 Aguilera_3
3 Acosta Acosta_2 Acosta_3 #Acosta_4 missing
4 Aguilera Aguilera_2 Aguilera_3 # Aguilera_4 missing
5 other 1 3
6 other 2 3
期望的输出:
genus sp sp2
1 Acosta Acosta_1 Acosta_3
2 Aguilera Aguilera_1 Aguilera_3
3 Acosta Acosta_2 Acosta_4
4 Aguilera Aguilera_2 Aguilera_4
5 other 1 3 # EDIT: new rows
6 other 2 3
解决方案
您可以添加另一列进行合并:
library(data.table)
merge(
transform(chromdata, r = rowid(genus)),
transform(treedata, r = rowid(genus)),
by=c("r", "genus")
)
r genus sp.x sp.y
1 1 Acosta Acosta_1 Acosta_3
2 1 Aguilera Aguilera_1 Aguilera_3
3 2 Acosta Acosta_2 Acosta_4
4 2 Aguilera Aguilera_2 Aguilera_4
如果您不想加载 data.table,您也可以通过类似ave(genus, genus, FUN = seq_along)
或许多其他方式获得 rowid。
推荐阅读
- amazon-web-services - AWS SNS HTTP 订阅未调用端点
- php - 未经许可的 uri 删除字符后 CodeIgniter 重定向 URL
- javascript - 事件监听器不起作用
- payment-gateway - 如何在 Magento 2 中处理覆盖 Magento\Sales\Model\Order\Email\Sender\OrderSender 的冲突
- google-bigquery - bigquery csv 导出 UTF8 编码
- javascript - 如何在javascript中正确更新数组中索引的值
- java - 如何在数组列表中提取 JSON 响应值?
- email - 双重电子邮件或电子邮件触发器两次以进行自动化操作
- swagger - Swagger Editor,如何添加额外的“隐藏”信息?
- sql - SQL Server 重置数字