【问题标题】:R - Compare lists and flag matchesR - 比较列表和标记匹配
【发布时间】:2015-04-04 06:59:57
【问题描述】:

我有 2 个列表,我需要识别并标记列表 1 和列表 2 之间匹配的位置。

例子:

List 1  List 2
   1      1
   2      2
   3      3
   4      4
   5      5
   6    
   7    
   8    
   9    
  10    

期望的输出:

List 1  Match
  1       Y
  2       Y
  3       Y
  4       Y
  5       Y
  6       N
  7       N
  8       N
  9       N
  10      N

我尝试了将 if 语句组合在一个循环中,但无论匹配如何,都会产生否定结果。任何帮助将非常感激!

我目前的做法:

for(x in 1:List1)) 

{

  if(List1[x] %in% List2 == TRUE) {
    List1$Match <- 'Yes'
  }else{
    List1$Match <- 'No'
  }

}  

所以我需要将 TRUE 或 FALSE 附加到列表 1

    > List1 %in% List2==TRUE
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE

这个诀窍可以用 Y 和 N 代替 true false:

List1$Match <- List1 %in% List2==TRUE

【问题讨论】:

  • 他们是lists 还是vectors 在list 中?
  • chr [1:10] “1” “2” “3” “4” “5” “6” “7” “8” “8” “10”
  • 我想你在找c("N", "Y")[(List1 == List2) + 1]
  • 附加到List1 是什么意思? List1 是一个向量。你想做什么?是否要替换 List1 中的值?
  • List1$Match &lt;- List1 %in% List2==TRUE 是一个可怕的词。为什么不只是List1$Match &lt;- List1 %in% List2

标签: r list loops if-statement match


【解决方案1】:
list1 <- c( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
list2 <- c( 1, 2, 3, 4, 5)

result1 <- list1 %in% list2

result1 <- gsub("TRUE", "Y", result1)  
result1 <- gsub("FALSE", "N", result1) 

【讨论】:

  • 是的,这就是我最终的结果!谢谢大家:)
  • 好答案,我冒昧地编辑了您的答案以添加数据框创建步骤,这与我的很接近。你只是快一点:-)。我将@Methexis 问题解释为需要制作一个包含第一个列表和“是/否”匹配列的数据框。
  • @Methexis 如果你想“追加”匹配,请考虑df&lt;-data.frame(list1, match=result1, stringsAsFactors=FALSE) 我尝试将其作为编辑,但这显然是错误的形式,我很抱歉。
【解决方案2】:

gsub不需要使用两次,你可以简单地使用索引

List1 <- 1:10
List2 <- 1:5

c("N", "Y")[(List1 %in% List2) + 1]
## [1] "Y" "Y" "Y" "Y" "Y" "N" "N" "N" "N" "N"

甚至更简单

ifelse(List1 %in% List2, "Y", "N")
# [1] "Y" "Y" "Y" "Y" "Y" "N" "N" "N" "N" "N"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多