在列中不匹配整个文本以供参考

时间:2013-01-24 15:03:15

标签: r text merge

我有两个数据文件。第一个是我正在编译数据的“主表”,相关列看起来像:

Family          ID                     Size
Tyrannidae      Empidonax traillii
Tyrannidae      Empidonax atriceps
Conopophagidae  Conopophaga lineata

大小是我想要填写的列。我需要将来的分析ID包含属和物种名称。大小数据基于类别(ID中的第一个单词)在单独的文件中,如下所示:

 Genus        Size
Empidonax     13
Conopophaga   6

在R中是否有一种方法可以说明在ID列中匹配某些(而非全部)文本,然后才能填写“大小”列?期望的结果

Family          ID                     Size
Tyrannidae      Empidonax traillii     13
Tyrannidae      Empidonax atriceps     13
Conopophagidae  Conopophaga lineata    6

或者将ID列拆分为两个更简单,填写Size然后将两者合并在一起?

谢谢

2 个答案:

答案 0 :(得分:4)

如果mastersize是您的数据框,您可以创建一个Genus列,然后使用merge获取合并的数据框。

#regex deletes all characters after a space
master$Genus <- gsub(" .*$","",master$ID) 
merge(master,size,by="Genus")

答案 1 :(得分:3)

由于data.table启用了X[Y],因此它似乎非常合适。因此,这是一个data.table解决方案:

require(data.table)
master <- data.table(Family=c("Tyrannidae", "Tyrannidae", "Conopophagidae"), 
          ID = c("Empidonax traillii", "Empidonax traillii", "Conopophaga lineata"))
dt <- data.table(Genus = c("Empidonax", "Conopophaga"), Size = c(13, 6))

# get Genus
master[, Genus := gsub(" .*$", "", ID)] # master$ID replaced by ID
# set key to Genus
setkey(master, "Genus")
> master[dt] # X[Y]

#          Genus         Family                  ID Size
# 1:   Empidonax     Tyrannidae  Empidonax traillii   13
# 2:   Empidonax     Tyrannidae  Empidonax traillii   13
# 3: Conopophaga Conopophagidae Conopophaga lineata    6