Я хотел бы построить в Rcpp
такое подмножество iris
набора данных:Rcpp Подменят ряды DataFrame
head(subset(iris, Species == "versicolor"))
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
51 7.0 3.2 4.7 1.4 versicolor
52 6.4 3.2 4.5 1.5 versicolor
53 6.9 3.1 4.9 1.5 versicolor
54 5.5 2.3 4.0 1.3 versicolor
55 6.5 2.8 4.6 1.5 versicolor
56 5.7 2.8 4.5 1.3 versicolor
Я знаю, как подмножество столбцов Rcpp::DataFrame
- есть перегруженный оператор [
, который работает как в R: x["var"]
. Однако я не могу найти способ, который позволил бы мне подмножать строки DataFrame с нефиксированным числом столбцов.
Я хотел был бы написать функцию subset_rows_rcpp_iris
которая принимает Rcpp::DataFrame
(которая всегда будет диафрагмой) и CharacterVector level_of_species
как входные сигналы. Он вернет объект DataFrame
.
DataFrame subset_rows_rcpp_iris(DataFrame x, CharacterVector level_of_species) {
...
}
Прежде всего, я хочу найти индексы строк, которые удовлетворяют логическому запросу. Моя проблема заключается в том, что если я получаю доступ к вектору Species
в функции test
, сохраните его как CharacterVector
, а затем сравните его с level_of_species
. Я получаю всегда только одно значение TRUE
в случае setosa
и значений FALSE в других случаях.
cppFunction('
LogicalVector test(DataFrame x, CharacterVector level_of_species) {
CharacterVector sub = x["Species"];
LogicalVector ind = sub == level_of_species;
return(ind);
}
')
head(test(iris, "setosa"))
[1] TRUE FALSE FALSE FALSE FALSE FALSE
Если это работало, я мог бы переписать test
функции и использовать вектор с true/false значений подмножества каждого из столбца фрейма данных по отдельности, а затем объединить их снова с Rcpp::DataFrame::create
.
Да, действительно. Тем не менее, я не знаю, как я могу представить скалярный символ в C++. В Rcpp нет такого класса, как 'CharacterScalar'. 'String' тоже не работает. –
правый правый !! моя ошибка. Поскольку там был NumericScalar, я подумал, что здесь тоже. Я думаю, что мы принимаем recylcing R в C++ здесь, когда делаем sub == level_of_species –
, нам нужно иметь цикл for –