小编sta*_*lax的帖子

使用data.table聚合所有列

我想做相同的以下内容,但使用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解决方案是'可行.

aggregate r data.table

17
推荐指数
1
解决办法
1万
查看次数

覆盖R的C++编译标志的系统默认值

我正在使用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也没关系?

c++ r g++ rcpp eigen

8
推荐指数
1
解决办法
1498
查看次数

将纬度/经度转换为州平面坐标

我有一个纬度和经度的数据集,我想转换为伊利诺斯东部的州平面坐标,使用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)

gis r latitude-longitude rgdal

7
推荐指数
2
解决办法
7828
查看次数

随机地用特征置换矩阵的行/列

我正在使用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是否有效的任何想法?)

c++ random permutation matrix eigen

5
推荐指数
1
解决办法
5688
查看次数

读取CSV时自动将NAs转换为0

为了节省空间,我从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.格洛腾迪克的定制课程答案很快,谢谢你的想法!)

csv r data.table

2
推荐指数
1
解决办法
4444
查看次数

cbind(R函数)等效于numpy

这是我想要的行为:

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)

python numpy r cbind

1
推荐指数
1
解决办法
3495
查看次数

标签 统计

r ×5

c++ ×2

data.table ×2

eigen ×2

aggregate ×1

cbind ×1

csv ×1

g++ ×1

gis ×1

latitude-longitude ×1

matrix ×1

numpy ×1

permutation ×1

python ×1

random ×1

rcpp ×1

rgdal ×1