【问题标题】:Match character vector with a dataframe and add a new column将字符向量与数据框匹配并添加新列
【发布时间】:2021-12-16 03:38:35
【问题描述】:

我有一个数据框df;

ID mp1 mp2 mp3 mp4
C1 25 28 32 37
C2 24 45 38 0
C3 28 33 24 20

一个字符向量:

vec = c('32','35','28')

并且我想将字符向量 vec 值与数据框 df 匹配,例如,如果一个或多个值匹配它添加一个包含 0 和 1 的新列(O 不是匹配和1 匹配)

ID mp1 mp2 mp3 mp4 dec
C1 25 28 32 37 1
C2 24 45 38 0 0
C3 28 33 24 20 1

【问题讨论】:

    标签: r pattern-matching matching


    【解决方案1】:

    基础R中的替代解决方案:

    f <- function(x) 1 * (sum(is.na(match(vec, x))) < 3)
    
    df <- cbind(df, dec = apply(df, 1, f))
    

    【讨论】:

      【解决方案2】:
      df$dec <- +(rowSums(sapply(df[,-1], `%in%`, vec)) > 0)
      df
      #   ID mp1 mp2 mp3 mp4 dec
      # 1 C1  25  28  32  37   1
      # 2 C2  24  45  38   0   0
      # 3 C3  28  33  24  20   1
      
      • df[,-1] 是仅比较我们需要的列的一种方法;我们也可以使用df[,2:5] 或其他几种列选择工具之一​​。

      • sapply(...)返回一个逻辑矩阵,如果在vec中找到特定元素:

        sapply(df[,-1], `%in%`, vec)
        #        mp1   mp2   mp3   mp4
        # [1,] FALSE  TRUE  TRUE FALSE
        # [2,] FALSE FALSE FALSE FALSE
        # [3,]  TRUE FALSE FALSE FALSE
        
      • 逻辑,当求和时,转换为整数,FALSE 为 0,TRUE 为 1,所以你的逻辑 “一个或多个” 意味着一行的总和大于0:

        rowSums(sapply(df[,-1], `%in%`, vec)) > 0
        # [1]  TRUE FALSE  TRUE
        
      • +(...) 是一种将逻辑转换为整数等价物的技巧(类似于上一个项目符号)。


      数据

      df <- structure(list(ID = c("C1", "C2", "C3"), mp1 = c("25", "24", "28"), mp2 = c("28", "45", "33"), mp3 = c("32", "38", "24"),     mp4 = c("37", "0", "20")), class = "data.frame", row.names = c(NA, -3L))
      

      【讨论】:

        猜你喜欢
        • 2012-04-11
        • 2018-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多