【问题标题】:Return a different column of the dataframe if there is a grep match between two vectors如果两个向量之间存在 grep 匹配,则返回数据框的不同列
【发布时间】:2019-02-10 09:09:32
【问题描述】:

我有一个文件名向量和一个数据框,其中包含每个文件名的“组”名称。

files <- c("data/backup/LATEST/20181514.X1235",
           "data/backup/LATEST/X1255+20181514",
           "data/backup/LATEST/20181514-X1237",
           "data/backup/LATEST/20181514-E1235",
           "data/backup/LATEST/20181514F1235",
           "data/backup/LATEST/M32_-X6635__20181514",
           "data/backup/LATEST/20181514-X1205",
           "data/backup/LATEST/l-A1230.20181514-XX")

groups <- data.frame(
                    ID = c("X1235","X1255","A1230","K93430",
                           "LOP0343","J3490","X1205","X6635",
                           "F1235","E1235","X1237"), 
                    Group = c("A","A","A",
                              "B","A","A",
                              "B","B","B",
                              "B","A")
)

作为最终结果,我想要一个数据框,其中一列包含来自 files 的完整文件路径,第二列显示其 group

我怎样才能做到这一点?

结果

                           filepath         group
1 data/backup/LATEST/20181514.X1235         A
2 data/backup/LATEST/X1255+20181514         A
3 data/backup/LATEST/20181514-X1237         A
4 data/backup/LATEST/20181514-E1235         B
5 data/backup/LATEST/20181514F1235          B
6 data/backup/LATEST/M32_-X6635__20181514   B
7 data/backup/LATEST/20181514-X1205         B
8 data/backup/LATEST/l-A1230.20181514-XX    A

【问题讨论】:

  • 拆分"-" 新建一列,然后merge
  • 好的,那么请让您的输入数据代表您的真实数据。
  • 在这种情况下你想如何匹配my/file/path/X123X123=groupAX1234=groupBZX123=groupC

标签: r regex dataframe grepl


【解决方案1】:

这是使用stringr::str_detect的一种方式

library(stringr)
strdet <- function(x){
      #browser()
      groups[str_detect(x,groups$ID),'Group']
      }

apply(df, 1, strdet)

[1] "A" "A" "A" "B" "B" "B" "B" "A"

PS:

  • 我将文件更改为数据框并
  • 我假设您在文件和组之间存在一对一的关系
  • 我使用stringAsFactor=FALSE 阅读了df

    数据

    df <- data.frame(files, stringsAsFactors = FALSE)
    
  • 【讨论】:

    • 我正准备用sapply(files, function(x) groups$Group[str_detect(x, groups$ID)])发帖
    • IMO 最好groups[str_detect(x,as.character(groups$ID)),'Group']
    • @RonakShah 我喜欢你的单行回答。只需将%&gt;% unlist %&gt;% as.data.frame 添加到您的代码中即可满足我的需求。谢谢你。
    【解决方案2】:

    使用基础 R,您可以创建 group 向量:

    group_list <- lapply(groups$ID,
           function(patt) groups$Group[which(grepl(patt, files))])
    data.frame(files=files, group=unlist(group_list))
        files                                    group
        data/backup/LATEST/20181514.X1235        A
        data/backup/LATEST/X1255+20181514        A
        data/backup/LATEST/20181514-X1237        B
        data/backup/LATEST/20181514-E1235        B
        data/backup/LATEST/20181514F1235         A
        data/backup/LATEST/M32_-X6635__20181514  A
        data/backup/LATEST/20181514-X1205        B
        data/backup/LATEST/l-A1230.20181514-XX   A
    

    这就是你要找的吗?

    【讨论】:

      【解决方案3】:

      如果您可以假设 ID 字符串的构建方式(一个字母,四个数字),使用 tidverse:

      data.frame(file=files) %>%
        mutate(ID=str_extract(file,"[A-Z]\\d{4}")) %>%
        left_join(groups,by="ID")
      

      我在创建群组时添加了stringsAsFactors=FALSE 以避免出现警告。

      如果你不能:

      library(fuzzyjoin)
      data.frame(file=files,stringsAsFactors=FALSE) %>%
        fuzzy_left_join(groups, by=list(x="file",y="ID"), match_fun=str_detect)
      

      【讨论】:

      • 这太复杂了。 ID 字符串没有统一的结构。
      猜你喜欢
      • 2020-01-07
      • 2020-11-24
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多