小编Flo*_*ald的帖子

如何在data.table中按引用删除行?

我的问题与引用分配和复制分配有关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)

r data.table

144
推荐指数
5
解决办法
5万
查看次数

在一个函数调用中向R 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  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)

r data.table

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

在v1.8.3之前的R {data.table}中使用`:=`时如何抑制输出?

有没有办法防止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)

r data.table

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

将多个列添加到data.table的子集中:=

我的问题是对此前回答的问题的扩展:

在一个函数调用中向R data.table添加多个列?

如果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)

r data.table

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

按组分组多个分位数

我该怎么做这个计算:

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)

r plyr

13
推荐指数
2
解决办法
2万
查看次数

用索引向量对犰狳矩阵的所有列进行排序的最佳方法

我想知道是否有更好的方法来实现我在这里所做的事情.我有一个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)

c++ armadillo

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

data.table有效替代分组赋值为DT [,x:= f(y),by = z]?

我正在寻找一个尚未实现(据我所知)通过引用在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)

r data.table

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

matlab样式索引C++数组

我想知道以下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 ++中执行此操作的最佳方法是什么?

c++ indexing matlab

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

在Eigen中找到rowwise maxCoeff和maxCoeff的索引

我想找到矩阵行的最大值和索引.我基于特征网站上的一个例子(例子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)矩阵.谢谢!

(也发送到特征列表,抱歉交叉发布.)

eigen

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

加入和不加入data.table的组合?

我的问题涉及带有多个键的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)

r data.table

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

标签 统计

r ×7

data.table ×6

c++ ×2

armadillo ×1

eigen ×1

indexing ×1

matlab ×1

plyr ×1