【问题标题】:print objects in common in two character objects打印两个字符对象中的共同对象
【发布时间】:2013-08-28 03:03:34
【问题描述】:

我有两个字符对象,我需要查看它们共有多少个字符,然后打印它们。我可以毫无疑问地看到它们有多少共同点,但我似乎无法弄清楚打印它们的代码。这是一个简单的例子:

LETTERS
list <- c("A", "H", "J", "K")
length(na.exclude(pmatch(LETTERS[1:20],list[1:3]))) 
print(pmatch(LETTERS[1:20],list[1:3]))

打印出来:

  LETTERS
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
[20] "T" "U" "V" "W" "X" "Y" "Z"
  list <- c("A", "H", "J", "K")
  length(na.exclude(pmatch(LETTERS[1:20],list[1:3])))
[1] 3
  print(pmatch(LETTERS[1:20],list[1:3]))
[1]  1 NA NA NA NA NA NA  2 NA  3 NA NA NA NA NA NA NA NA NA NA

所以我知道有 3 个共同点,并且我知道它们的位置,但是我如何让它打印“A”“H”“J”?

【问题讨论】:

    标签: r string object character


    【解决方案1】:

    尝试使用%in%

    > LETTERS[LETTERS %in% list]
    [1] "A" "H" "J" "K"
    

    你的例子:

    myletters<-LETTERS[1:20]
    > myletters[myletters %in% list[1:3]]
    [1] "A" "H" "J"
    

    替代方案:按照您的建议使用pmatch

    pmatch(list[1:3],myletters) # gives the indices
    [1]  1  8 10
    
    myletters[pmatch(list[1:3],myletters)] # get the letters
    [1] "A" "H" "J"
    

    【讨论】:

    • 这是一种更好的方法 (@metrics),但与您的方法一起使用 list[na.omit(pmatch(LETTERS[1:20],list[1:3]))] 会奏效。并且不要覆盖列表,因为它是 R 基础对象。见?list
    【解决方案2】:

    如果您只想将最终结果作为一个集合(删除重复项),请使用:

    intersect(LETTERS, c("A", "H", "J"))
    

    如果您想使用部分匹配,您必须注意pmatch 确实不允许 允许第一个输入中的多个元素与第二个输入中的相同元素匹配。注意区别:

    mylist <- c("B","A","B","2")
    
    > pmatch(mylist, LETTERS)
    [1]  2  1 NA NA
    
    > Vectorize(pmatch, "x")(mylist, LETTERS)
     B  A  B  2 
     2  1  2 NA
    

    现在,如果您想打印 mylist 的元素(部分)与 LETTERS 的元素匹配,保持顺序和重复,您可以使用:

    > mylist[!is.na(Vectorize(pmatch, "x")(mylist, LETTERS))]
    [1] "B" "A" "B"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多