Если я правильно понимаю ваш вопрос, проблема сейчас в том, чтобы объединить таблицы в подстроки столбцов. Один из способов добиться этого - извлечь эту подстроку и добавить ее в 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
.
Можно использовать генерировать алгоритм для более общего способа заполнить контейнеры:
#include <iostream>
#include <algorithm>
#include <vector>
struct c_unique {
int current;
c_unique() {current=0;}
int operator()() {return ++current;}
} UniqueNumber;
int main () {
vector<int> myvector (8);
generate (myvector.begin(), myvector.end(), UniqueNumber);
cout << "\nmyvector contains:";
for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
cout << " " << *it;
cout << endl;
return 0;
}
Это было бесстыдно снято и отредактировано от cplusplusreference.
Я обычно иду с std::generate
плюс простой генератор:
template <typename T>
struct gen {
T x;
gen(T seed) : x(seed) { }
T operator ()() { return x++; }
};
generate(a.begin(), a.end(), gen<int>(0));
Если у Вас есть массив стиля C, можно использовать std:copy, например,
int c_array[] = {3,4,5};
const int* pbegin = &c_array[0];
const size_t c_array_size = sizeof(c_array) / sizeof(c_array[0]);
const int* pend = pbegin + c_array_size;
std::vector<int> v;
v.reserve(c_array_size);
std::copy(pbegin, pend, std:back_inserter(v));
При использовании STL SGI (или производная, такая как STLPort), можно использовать iota
. :-)
void IndexArray(unsigned int length, vector<unsigned int>& v)
{
vector<unsigned int>(length).swap(v);
iota(v.begin(), v.end(), 0);
}
Существует также iota()
функция в Adobe. ASL, (и value_iterator также). В повышении, существует counting_iterator, и я подозреваю, что несколько других способов сделать генерируют последовательности числа на лету в повышении.