Rcpp импорт списка / dataframe из R с большим количеством переменных - PullRequest
0 голосов
/ 07 февраля 2019

Я новичок в программировании Rcpp, и я не могу понять очень простую вещь.

Я пытаюсь импортировать большой список из R в c ++.Я использую Rcpp.В моем списке около 400 000 строк и 50 столбцов.Я воссоздаю уменьшенную версию здесь для вашей справки.

df1 = data.frame(Variable1=c(1,2,3,4,5,6,7,8,9,10,1),Variable2=c(11,12,13,14,15,16,17,18,19,20,11),
             Variable3 = c(1,0,0,1,1,0,0,0,1,0,1),
             Variable4=c(1,1,1,1,2,2,2,2,2,2,2),
             Variable5=c(20,-2,-5,10,30,2,1,.5,50,-1,60))

Это объект dataframe.Из этого поста ( я знаю, сколько векторов можно добавить в DataFrame :: create (vec1, vec2 ...)? ), что вы можете импортировать только объекты dataframe в Rcpp с 20 столбцами.Вы также можете иметь столько столбцов, сколько захотите, из поста Кевина Уши ( сколько векторов можно добавить в DataFrame :: create (vec1, vec2 ...)? ).Я бы предпочел не использовать маршрут dataframe, так как мне нужно написать довольно сложную функцию.

Моя путаница возникает из-за следующего: когда я использую

typeof(df1)

R говорит мне, что это объект списка.

Что было бы лучшим способом импортировать этоданные в Rcpp?Может ли кто-нибудь указать мне на источник / показать мне код реплики, который я мог бы использовать для своего набора данных (обратите внимание, что мой набор данных имеет 50 столбцов)?

Любая помощь / совет будет принята с благодарностью.

1 Ответ

0 голосов
/ 07 февраля 2019

Как упоминали @RalfStubner и @duckmayr, возможно, вы неправильно прочитали существующие ограничения на конструкцию .Нет никаких ограничений на принятие существующих объектов фрейма данных .

Для иллюстрации приведем не совсем разумный пример столбца 500 data.frame (который для простоты мы предполагаем содержатьтолько числовые векторы), где мы суммируем все элементы в первой строке.

Код

#include <Rcpp.h>

// [[Rcpp::export]]
double extractFromBigDataFrame(Rcpp::DataFrame d, bool verbose=false) {
  int n = d.length();
  double sum = 0;
  for (int i=0; i<n; i++) {
    // we are making a simplifying assumption here that each column is numeric
    Rcpp::NumericVector x = d[i];
    double elem = x[0];
    sum += elem;
    if (verbose) print(x);
  }
  return sum;
}

/*** R
m <- matrix(1:1000, 2, 500)
d <- as.data.frame(m)
extractFromBigDataFrame(d)
rowSums(m)  # comparison
*/

Выход

R> Rcpp::sourceCpp("/tmp/so54563983.cpp")

R> m <- matrix(1:1000, 2, 500)

R> d <- as.data.frame(m)

R> extractFromBigDataFrame(d)
[1] 250000

R> rowSums(m)  # comparison
[1] 250000 250500
R> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...