Vlookup的R版本,每个单元具有多个匹配项

时间:2019-03-28 01:09:59

标签: r match vlookup

我有一个带有数字和查找表的向量。我希望数字替换为查找表中的描述。

当向量像下面的例子一样简单时,这很容易:

> variable <- sample(1:5, 10, replace=T)
> variable
 [1] 5 4 5 3 2 3 2 3 5 2
> 
> lookup <- data.frame(var = 1:5, description=LETTERS[1:5])
> lookup
  var description
1   1           A
2   2           B
3   3           C
4   4           D
5   5           E
> 
> with(lookup, description[match(variable, var)])
 [1] E D E C B C B C E B
Levels: A B C D E

但是,当向量的单个元素包含多个结果时,我会遇到麻烦:

variable <- c("1", "2^3", "1^5", "4", "4")

我希望返回的向量为:

c("A", "B^C", "A^E", "D", "D")

任何帮助表示赞赏!

关于, 卢克

3 个答案:

答案 0 :(得分:2)

如评论中所述,要获得所需的输出,需要执行几个步骤。以下内容将拆分变量,将结果与description变量建立索引,然后使用粘贴折叠多个元素。

sapply(strsplit(variable, "\\^"), function(x) paste0(lookup$description[as.numeric(x)], collapse = "^"))
[1] "A"   "B^C" "A^E" "D"   "D"  

答案 1 :(得分:2)

如果只有一个字符匹配和替换,则可以使用chartr

chartr(paste0(lookup$var, collapse = ""), 
       paste0(lookup$description, collapse = ""), variable)

#[1] "A"   "B^C" "A^E" "D"   "D"  

chartr基本上告诉替换

paste0(lookup$var, collapse = "")
#[1] "12345"

paste0(lookup$description, collapse = "")
#[1] "ABCDE"

它也很有用,因为它不会更改或返回NA用于不匹配的字符。

答案 2 :(得分:2)

您可以使用scan将文本解析为数字,然后可以将其用作索引来选择可以折叠在一起的项目。添加quiet = TRUE可禁止显示“已读”消息。

sapply(variable, function(t) { 
              paste( lookup$description[ scan(text=t, sep="^")], collapse="^")} )

Read 1 item
Read 2 items
Read 2 items
Read 1 item
Read 1 item
    1   2^3   1^5     4     4 
  "A" "B^C" "A^E"   "D"   "D"