Как заполнить вектор нетривиальными начальными значениями?

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

15
задан andreas buykx 16 October 2008 в 11:06
поделиться

5 ответов

Можно использовать генерировать алгоритм для более общего способа заполнить контейнеры:

#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.

15
ответ дан 1 December 2019 в 02:38
поделиться

Я обычно иду с 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));
5
ответ дан 1 December 2019 в 02:38
поделиться

Если у Вас есть массив стиля 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));
0
ответ дан 1 December 2019 в 02:38
поделиться

При использовании 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);
}
4
ответ дан 1 December 2019 в 02:38
поделиться

Существует также iota() функция в Adobe. ASL, (и value_iterator также). В повышении, существует counting_iterator, и я подозреваю, что несколько других способов сделать генерируют последовательности числа на лету в повышении.

2
ответ дан 1 December 2019 в 02:38
поделиться
Другие вопросы по тегам:

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