объединить две таблицы в R с помощью неявных столбцов

Часто нам нужно изменить подстроку с несколькими ключевыми словами, разбросанными по строкам, предшествующим подстроке. Рассмотрим элемент xml:

<TASK>
  <UID>21</UID>
  <Name>Architectural design</Name>
  <PercentComplete>81</PercentComplete>
</TASK>

Предположим, мы хотим изменить 81, к некоторому другому значению, скажем 40. Сначала определите .UID.21..UID., затем пропустите все символы, включая \n до .PercentCompleted.. Шаблон регулярного выражения и спецификация замены:

String hw = new String("<TASK>\n  <UID>21</UID>\n  <Name>Architectural design</Name>\n  <PercentComplete>81</PercentComplete>\n</TASK>");
String pattern = new String ("(<UID>21</UID>)((.|\n)*?)(<PercentComplete>)(\\d+)(</PercentComplete>)");
String replaceSpec = new String ("$1$2$440$6");
//note that the group (<PercentComplete>) is $4 and the group ((.|\n)*?) is $2.

String  iw = hw.replaceFirst(pattern, replaceSpec);
System.out.println(iw);

<TASK>
  <UID>21</UID>
  <Name>Architectural design</Name>
  <PercentComplete>40</PercentComplete>
</TASK>

Подгруппа (.|\n), вероятно, является отсутствующей группой $3. Если мы сделаем его не захватывающим с помощью (?:.|\n), то $3 будет (<PercentComplete>). Таким образом, шаблон и replaceSpec также могут быть:

pattern = new String("(<UID>21</UID>)((?:.|\n)*?)(<PercentComplete>)(\\d+)(</PercentComplete>)");
replaceSpec = new String("$1$2$340$5")

, и замена работает правильно, как и раньше.

1
задан Henrik 3 March 2019 в 12:11
поделиться

1 ответ

Если я правильно понимаю ваш вопрос, проблема сейчас в том, чтобы объединить таблицы в подстроки столбцов. Один из способов добиться этого - извлечь эту подстроку и добавить ее в tab1.

Поскольку строки в tab1 идентичны, а идентификаторы в tab2 не совпадают ни с одним из tab1, я использовал разные наборы:

tab1 <- structure(list(campaign = c("(GR23)(BGM)(AND)(FB)(App Events)(US)(W35+)(27.09.2018) (23843105742120752)", 
                                    "(GR23)(BGM)(AND)(FB)(App Events)(US)(W35+)(27.09.2018) (23843105742120753)"), 
                       adgroup = c("(GR23)(BGM)(AND)(FB)(META)(US)(W35+)(NONE)(APP_EV)(NONE)(PURCHASE)(NONE)(27.09.2018) (23843105743590752)", 
                                   "(GR23)(BGM)(AND)(FB)(META)(US)(W35+)(NONE)(APP_EV)(NONE)(PURCHASE)(NONE)(27.09.2018) (23843105743590752)"), 
                       generated_id = c(482160724447511, 482160724447511)), 
                  row.names = c(NA, -2L), class = "data.frame")
tab2 <- structure(list(campaign_id = c("23843105742120752", "23843105742120753"), 
                       ad_set_id = c("23843105743590752", "23843105743590752"), 
                       date = c("10.10.2018", "10.10.2018"), spent = c(1.77, 13.85)), 
                  row.names = c(NA, -2L), class = "data.frame")


# Create a function that extracts the id from the last part
extract_id <- function(x){
  s <- strsplit(as.character(x), " ")
  s_id <- sapply(s, function(si) si[length(si)])
  ids <- gsub("[^[:digit:] ]", "", s_id) # Remove all but digits/numbers
  return(ids)
}

# Add the extracted id's to tab1
tab1$campaign_id <- extract_id(tab1$campaign)
tab1$adgroup_id <- extract_id(tab1$adgroup)

# Your result
result <- merge(tab1, tab2, 
                by.x = c("campaign_id", "adgroup_id"), 
                by.y = c("campaign_id", "ad_set_id"))

Обратите внимание, что помимо разных значений, некоторые столбцы также имеют разные типы. То есть character вместо factor.

0
ответ дан Teun 3 March 2019 в 12:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: