我的问题与引用分配和复制分配有关data.table.我想知道是否可以通过引用删除行,类似于
DT[ , someCol := NULL]
Run Code Online (Sandbox Code Playgroud)
我想知道
DT[someRow := NULL, ]
Run Code Online (Sandbox Code Playgroud)
我想有一个很好的理由说明为什么这个功能不存在,所以也许你可以指出一个很好的替代通常的复制方法,如下所示.特别是,从我的例子(data.table)开始,
DT = data.table(x = rep(c("a", "b", "c"), each = 3), y = c(1, 3, 6), v = 1:9)
# x y v
# [1,] a 1 1
# [2,] a 3 2
# [3,] a 6 3
# [4,] b 1 4
# [5,] b 3 5
# [6,] b 6 6
# [7,] c 1 7
# [8,] c 3 8
# [9,] c 6 …Run Code Online (Sandbox Code Playgroud) 我有一个函数,在列表中返回两个值.这两个值都需要添加到两个新列的data.table中.对功能的评估是昂贵的,所以我想避免必须两次计算功能.这是一个例子:
library(data.table)
example(data.table)
DT
x y v
1: a 1 42
2: a 3 42
3: a 6 42
4: b 1 4
5: b 3 5
6: b 6 6
7: c 1 7
8: c 3 8
9: c 6 9
Run Code Online (Sandbox Code Playgroud)
这是我的功能的一个例子.记住我说这是昂贵的计算,除此之外,没有办法从其他给定值中推导出一个返回值(如下例所示):
myfun <- function (y, v)
{
ret1 = y + v
ret2 = y - v
return(list(r1 = ret1, r2 = ret2))
}
Run Code Online (Sandbox Code Playgroud)
这是我在一个语句中添加两列的方法.那个人需要两次打电话给myfun:
DT[,new1:=myfun(y,v)$r1][,new2:=myfun(y,v)$r2]
x y v new1 new2
1: a 1 42 43 -41 …Run Code Online (Sandbox Code Playgroud) 有没有办法防止data.table在通过引用分配新列后打印新的data.table?我收集的标准行为是
library(data.table)
example(data.table)
DT
# x y v
# 1: a 1 42
# 2: a 3 42
# 3: a 6 42
# 4: b 1 11
# 5: b 3 11
# 6: b 6 11
# 7: c 1 7
# 8: c 3 8
# 9: c 6 9
DT[,z:=1:nrow(DT)]
# x y v z
# 1: a 1 42 1
# 2: a 3 42 2
# 3: a 6 42 3
# …Run Code Online (Sandbox Code Playgroud) 我的问题是对此前回答的问题的扩展:
如果data.table有一个根据I子集的密钥,我在分配多个新列时遇到问题.例:
library(data.table)
example(data.table)
DT[J("a")]
x y v m
1: a 1 42 42
2: a 3 42 42
3: a 6 42 42
Run Code Online (Sandbox Code Playgroud)
即DT有一个key(DT) = c("x", "y"),我要指派2个新栏目new1,并new2在一个呼叫,与上述类似的解决方案.我这样做:
DT[J("a"),c("new1","new2") := list(c(1,2,3),c(3,2,1)),with=FALSE]
Run Code Online (Sandbox Code Playgroud)
但我明白了
x y v m new1
1: a 1 42 42 1
2: a 3 42 42 2
3: a 6 42 42 3
4: b 1 4 5 NA
5: b 3 5 5 NA
6: b 6 6 5 …Run Code Online (Sandbox Code Playgroud) 我该怎么做这个计算:
library(ddply)
quantile(baseball$ab)
0% 25% 50% 75% 100%
0 25 131 435 705
Run Code Online (Sandbox Code Playgroud)
按团队说,由"团队"说?我想要一个带有rownames"team"和列名"0%25%50%75%100%"的data.frame,即quantile每组一个呼叫.
干
ddply(baseball,"team",quantile(ab))
Run Code Online (Sandbox Code Playgroud)
不是正确的解决方案.我的问题是每个分组操作的OUTPUT是一个长度为5的向量.
换句话说,什么是一个巧妙的解决方案(永远不要头脑):
m=data.frame()
for (i in unique(baseball$team)){m=rbind(m,quantile(baseball[baseball$team==i, ]$ab))}
head(m,3)
X120 X120.1 X120.2 X120.3 X120.4
1 120 120.0 120.0 120.00 120
2 162 162.0 162.0 162.00 162
3 89 89.0 89.0 89.00 89
Run Code Online (Sandbox Code Playgroud) 我想知道是否有更好的方法来实现我在这里所做的事情.我有一个arma矩阵,我想通过存储在uvec向量中的索引重新排序它的所有列.我想我基本上是在复制整个矩阵.
#include <armadillo>
using namespace arma;
int main(){
// get a discrete random matrix
// defined umat because eventually want to
// order by a given column OF A. irrelevant now.
umat A = randi<umat>(4,6,distr_param(0,3));
std::cout << "A " << std::endl;
std::cout << A << std::endl;
// get an index vector with the now row order
uvec b;
b << 3 << 2 << 1 << 0;
std::cout << "sort by b:" << std::endl;
std::cout << b << …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个尚未实现(据我所知)通过引用在data.table中按组分配的最佳替代方案.使用data.table示例,
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
x y v
[1,] a 1 1
[2,] a 3 2
[3,] a 6 3
[4,] b 1 4
[5,] b 3 5
[6,] b 6 6
[7,] c 1 7
[8,] c 3 8
[9,] c 6 9
Run Code Online (Sandbox Code Playgroud)
我想添加一个新的列z,包含按x的值分组的f(y,v)(让我们取f(y,v)= mean(y)+ v).请注意,我不想打印或存储此计算的结果,如
DT[,mean(y)+v,by=x]
x V1
[1,] a 4.333333
[2,] a 5.333333
[3,] a 6.333333
[4,] b 7.333333
[5,] b 8.333333
[6,] b 9.333333
[7,] c 10.333333
[8,] c 11.333333
[9,] c 12.333333
Run Code Online (Sandbox Code Playgroud)
但我想将结果添加到DT:
x …Run Code Online (Sandbox Code Playgroud) 我想知道以下matlab习惯用法最有效的c ++实现是什么.
假设我在matlab,x,y和idx中有3个向量.
x = [13,2,5.5,22,107]
y = [-3,100,200]
idx = [1,2,5]
Run Code Online (Sandbox Code Playgroud)
我想用x的内容替换x的位置1,2和5.在matlab我做
x[idx] = y
Run Code Online (Sandbox Code Playgroud)
在c ++中执行此操作的最佳方法是什么?
我想找到矩阵行的最大值和索引.我基于特征网站上的一个例子(例子7).
#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{
MatrixXf mat(2,4);
mat << 1, 2, 6, 9,
3, 1, 7, 2;
MatrixXf::Index maxIndex;
VectorXf maxVal = mat.rowwise().maxCoeff(&maxIndex);
std::cout << "Maxima at positions " << endl;
std::cout << maxIndex << std::endl;
std::cout << "maxVal " << maxVal << endl;
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是我的路线
VectorXf maxVal = mat.rowwise().maxCoeff(&maxIndex);
Run Code Online (Sandbox Code Playgroud)
是错的.最初的例子有
float maxNorm = mat.rowwise().sum().maxCoeff(&maxIndex);
Run Code Online (Sandbox Code Playgroud)
即涉及额外减少.sum().有什么建议?我想我只想要与我写的matlab中的内容等价
[maxval maxind] = max(mymatrix,[],2)
Run Code Online (Sandbox Code Playgroud)
即找到最大值及其在mymatrix第二维上的索引,并返回(nrow(mymatrix),2)矩阵.谢谢!
(也发送到特征列表,抱歉交叉发布.)
我的问题涉及带有多个键的R data.table.举个例子:
library(data.table)
example(data.table)
key(DT)
[1] "x" "y"
Run Code Online (Sandbox Code Playgroud)
并且假设我想要一个"x不等于b且y不等于3"的变体,如下所示:
DT[!J("b",3)]
x y v v2 m
1: a 1 42 NA 42
2: a 3 42 NA 42
3: a 6 42 NA 42
4: b 1 4 84 5
5: b 6 6 84 5
6: c 1 7 NA 8
7: c 3 8 NA 8
8: c 6 9 NA 8
Run Code Online (Sandbox Code Playgroud)
我想要的变化是"x EQUAL b和y NOT 3",如下所示:
DT[J("b",!3)]
Error in `[.data.table`(DT, J("b", !3)) :
typeof x.y (double) != typeof …Run Code Online (Sandbox Code Playgroud)