我想做相同的以下内容,但使用data.table的"by":
dt <- data.table(V1=rnorm(100), V2=rnorm(100), V3=rnorm(100), ...
group=rbinom(100,2,.5))
dt.agg <- aggregate(dt, by=list(dt$group), FUN=mean)
Run Code Online (Sandbox Code Playgroud)
我知道我可以这样做:
dt.agg <- dt[, list(V1=mean(V1), V2=mean(V2), V3=mean(V3)), by=group]
Run Code Online (Sandbox Code Playgroud)
但对于这种情况,我正在考虑我有100个左右的列V1-V100(而且我总是希望通过单个因子聚合所有这些,如上面的汇总)所以我上面提到的data.table解决方案是'可行.
我正在使用RcppEigen为我的R代码编写一些C++函数,我想尽可能地优化它们的编译.当我过去使用Eigen时,我从-O3和-fopenmp得到了显着的提升.根据Dirk的建议,我编辑了〜/ .R/Makevars,以便使用这些标志编译我的Eigen代码:
CPPFLAGS=-O3 -fopenmp
Run Code Online (Sandbox Code Playgroud)
这工作 - 当我检查编译期间发生了什么(ps ax | grep cpp)时,我看到:
27097 pts/6 R+ 0:00 /usr/libexec/gcc/x86_64-redhat-linux/4.4.7/cc1plus -quiet -I/usr/include/R -I/home/sf/R/x86_64-redhat-linux-gnu-library/3.0/Rcpp/include -I/home/sf/R/x86_64-redhat-linux-gnu-library/3.0/RcppEigen/include -D_GNU_SOURCE -D_REENTRANT -DNDEBUG -D_FORTIFY_SOURCE=2 file69b757e053ad.cpp -quiet -dumpbase file69b757e053ad.cpp -m64 -mtune=generic -auxbase-strip file69b757e053ad.o -g -O3 -O2 -Wall -fopenmp -fpic -fexceptions -fstack-protector --param ssp-buffer-size=4 -o -
Run Code Online (Sandbox Code Playgroud)
我想要的旗帜在那里,-O3和-fopenmp.但是我也看到-O2,这可能是系统范围的默认值(我通过删除〜/ .R/Makevars验证了这一点,实际上,-O2就在那里但是-O3和-fopenmp不是.)
所以问题是:如何摆脱-O2?或者,它真的重要吗?g ++手册页说:
-O3 Optimize yet more. -O3 turns on all optimizations specified by -O2 and also
turns on the -finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse-
after-reload, -ftree-vectorize and -fipa-cp-clone options.
Run Code Online (Sandbox Code Playgroud)
那么也许同时拥有-O2和-O3也没关系?
我有一个纬度和经度的数据集,我想转换为伊利诺斯东部的州平面坐标,使用EPSG 2790(http://spatialreference.org/ref/epsg/2790/)或者ESRI 102672(http://spatialreference.org/ref/esri/102672/).
这肯定在之前被问过; 我的代码基于这里的答案(rgdal R包中的spTransform中的"非有限变换检测"和http://r-sig-geo.2731867.n2.nabble.com/Converting-State-Plane-Coordinates-td5457204. HTML).
但由于某种原因,我不能让它工作:
library(rgdal)
library(sp)
data = data.frame(long=c(41.20,40.05), lat=c(-86.14,-88.15))
coordinates(data) <- ~ long + lat
proj4string(data) <- CRS("+init=epsg:4326") # latitude/longitude
data.proj <- spTransform(data, CRS("+init=epsg:2790")) # illinois east
Run Code Online (Sandbox Code Playgroud)
得到:
non finite transformation detected:
long lat
41.20 -86.14 Inf Inf
Error in spTransform(data, CRS("+init=epsg:2790")) : failure in points 1
In addition: Warning message:
In spTransform(data, CRS("+init=epsg:2790")) :
2 projected point(s) not finite
Run Code Online (Sandbox Code Playgroud) 我正在使用Eigen而且我有一个矩阵:
MatrixXi x = MatrixXi::Random(5);
Run Code Online (Sandbox Code Playgroud)
我想使用随机抽取的排列随机置换行和列(对于行和列只有一个排列),即如果我有一个发送索引[0,1,2,3,4]的排列 - > [3,4,2,1,0]比我想用相同的排列重新排序行和列.
第1部分:我无法在线找到PermutationMatrix的示例,而且我无法弄清楚语法.
第2部分:如何获得随机置换的索引向量传递给它?也许std :: random_shuffle?
更新:
这是获得一组混乱索引的(可能是低效的)方法:
std::vector<int> perm;
for (int i=0; i<5; ++i) {
perm.push_back(i);
}
std::random_shuffle(perm.begin(), perm.end());
Run Code Online (Sandbox Code Playgroud)
所以现在的问题是我如何重新排序我的矩阵x,以便它的行/列按烫发排序?
更新2:
越来越近,这是有效的(思想来源:cplusplus.com):
int myrandom (int i) { return std::rand()%i;}
PermutationMatrix<Dynamic,Dynamic> perm(5);
perm.setIdentity();
for (int i=dim-1; i>0; --i) {
swap (perm.indices()[i],perm.indices()[myrandom(i+1)]);
}
cout << "original x" << x << endl << endl;
cout << "permuted x" << perm * x * perm << endl << endl;
Run Code Online (Sandbox Code Playgroud)
任何人都知道如何使用random_shuffle做到这一点?(参见以下不起作用的尝试.)
(额外的话:如果烫发是1e4 x 1e4矩阵,有关perm*x*perm是否有效的任何想法?)
为了节省空间,我从CSV文件中省略了零作为一种稀疏表示(所有数据都是数字):
table = read.csv(text = "
V1,V2,V3
0.3,1.2,1.5
0.5,,2.1
,.1,")
Run Code Online (Sandbox Code Playgroud)
这是我得到的:
> table
V1 V2 V3
1 0.3 1.2 1.5
2 0.5 NA 2.1
3 NA 0.1 NA
Run Code Online (Sandbox Code Playgroud)
我可以继续将NAs更改为0:
table[is.na(table)] = 0
V1 V2 V3
1: 0.3 1.2 1.5
2: 0.5 0.0 2.1
3: 0.0 0.1 0.0
Run Code Online (Sandbox Code Playgroud)
只是想知道在阅读时是否有一个单行班,最好是data.table的fread?:
table = fread("
V1,V2,V3
0.3,1.2,1.5
0.5,,2.1
,.1,")
Run Code Online (Sandbox Code Playgroud)
更多信息:我想避免的原因
table[is.na(table)] = 0
Run Code Online (Sandbox Code Playgroud)
是因为对我的数据的执行速度非常快,这个操作非常慢!(不确定原因.)我的数据集是336行x 3939列.(G.格洛腾迪克的定制课程答案很快,谢谢你的想法!)
这是我想要的行为:
import numpy as np
x = np.array([[1,2],[3,4]])
y = np.array([5, 6])
cbind(x,y) # desired result: np.array([[1,2,5],[3,4,6]])
Run Code Online (Sandbox Code Playgroud)
似乎应该很容易,但是我在http://mathesaurus.sourceforge.net/r-numpy.html(连接,hstack等)上找到的选项不起作用,例如:
np.hstack((x,y))
Run Code Online (Sandbox Code Playgroud)
给
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "X/site-packages/numpy/core/shape_base.py", line 288, in hstack
return _nx.concatenate(arrs, 1)
ValueError: all the input arrays must have same number of dimensions
Run Code Online (Sandbox Code Playgroud)