Я не видел упоминания выше, но вы также увидите, что некоторые люди используют левый и правый сдвиг для арифметических операций. Левый сдвиг на x эквивалентен умножению на 2 ^ x (пока он не переполняется), а правый сдвиг эквивалентен делению на 2 ^ x.
Недавно я видел людей, использующих x & lt; 1 и x >> 1 для удвоения и сокращения пополам, хотя я не уверен, что они просто стараются быть умными или действительно есть отличное преимущество над нормальными операторами.
Я не уверен, что вы пытаетесь сделать в точности, но вот какой-то быстрый и грязный код, чтобы перебрать столбцы в списке фреймов данных:
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::List listDf(Rcpp::List l) {
for (int i = 0; i < l.length(); ++i) {
Rcpp::DataFrame df = Rcpp::as<Rcpp::DataFrame>(l[i]);
for (int j = 0; j < df.cols(); ++j) {
Rcpp::NumericVector col = df[j];
df[j] = 1.23 * col;
}
}
return l;
}
/*** R
set.seed(42)
df1 <- data.frame(a = sample(1:100, 3),
b = sample(1:100, 3),
c = sample(1:100, 3))
df2 <- data.frame(a = sample(1:100, 3),
b = sample(1:100, 3),
c = sample(1:100, 3))
l <- list(df1 = df1, df2 = df2)
listDf(l)
*/
И если вы действительно хотите добавьте 1/100 последнего столбца к другим столбцам, вы можете использовать:
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::List listDf(Rcpp::List l) {
for (int i = 0; i < l.length(); ++i) {
Rcpp::DataFrame df = Rcpp::as<Rcpp::DataFrame>(l[i]);
Rcpp::NumericVector last = df[df.cols() - 1];
for (int j = 0; j < df.cols() - 1; ++j) {
Rcpp::NumericVector col = df[j];
df[j] = col + last / 100.0;
}
}
return l;
}
/*** R
set.seed(42)
df1 <- data.frame(a = sample(1:100, 3),
b = sample(1:100, 3),
c = sample(0:99, 3))
df2 <- data.frame(a = sample(1:100, 3),
b = sample(1:100, 3),
c = sample(0:99, 3))
l <- list(df1 = df1, df2 = df2)
listDf(l)
*/
Выход:
> listDf(l)
$df1
a b c
1 92.73 84.73 73
2 93.13 64.13 13
3 29.64 51.64 64
$df2
a b c
1 71.94 94.94 94
2 46.96 26.96 96
3 100.11 46.11 11
@ Ralf Stubner понял, что я дам вам визуальный
df1 <- data.frame(a = sample(1:100, 3), b = sample(1:100, 3), c = sample(0:99, 3))
дает (не задал.seed):
df1
a b c
28 70 70
14 63 5
8 12 20
dsets<-do.call("list", replicate(10, df1, simplify=FALSE)) #to replicate this 10 times
#and store as list
Запустите это
listDf(dsets)
И вывод выглядит следующим образом:
[[9]]
a b c
35.0 77.0 70
14.5 63.5 5
10.0 14.0 20
[[10]]
a b c
35.0 77.0 70
14.5 63.5 5
10.0 14.0 20
Наверное, что-то простое мне не хватает?
rep
, чем это только ссылка. Но прежде чем вы напишете объект, сделайте копию. Это потеряно при переходе на C ++. Ваш список dsets
содержит десять ссылок на один и тот же объект, которые затем обрабатываются на месте. Если вы создадите список из десяти различных кадров данных, то он работает так, как ожидалось.
– Ralf Stubner
13 July 2018 в 20:15