Вернуть другой столбец информационного кадра, если есть совпадение grep между двумя векторами - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть вектор имен файлов и датафрейм, который содержит имя «группы» для каждого из этих имен файлов.

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

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

Используя базу 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

Это то, что вы искали?

0 голосов
/ 05 сентября 2018

Если вы можете предположить, как строятся строки идентификаторов (одна буква, четыре цифры), с 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)
0 голосов
/ 05 сентября 2018

Вот способ использования 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:

Я меняю файлы на фрейм данных и Я полагаю, у вас есть отношение один к одному между файлами и группой
Я прочитал df, используя stringAsFactor=FALSE

данные

df <- data.frame(files, stringsAsFactors = FALSE)
...