小编leo*_*ido的帖子

还原列表结构

目标

给定一个列表列表,我的目标是改变其结构(R语言).

所以,我想将嵌套列表的元素作为第一层列表的元素.

可能更好地说明我的目的.鉴于:

z <- list(z1 = list(a = 1, b = 2, c = 3), z2 = list(b = 4, a = 1, c = 0))
Run Code Online (Sandbox Code Playgroud)

我想要一个等效于后续R对象的输出:

o <- list(a = list(z1 = 1, z2 = 1), b = list(z1 = 2, z2 = 4), c = list(z1 = 3, z2 = 0))
Run Code Online (Sandbox Code Playgroud)

解决方案

我的解决方案

我创建了自己的解决方案,我将在下面附上,但如果有更好的解决方案,请告诉我.

revert_list_str_1 <- function(ls) {
  res <- lapply(names(ls[[1]]), function(n, env) {
    name <- paste(n, 'elements', sep = '_')
    assign(name, vector('list', 0))
    inner …
Run Code Online (Sandbox Code Playgroud)

r list

20
推荐指数
3
解决办法
2984
查看次数

快速功能,按名称添加矢量元素

我写了这个R函数,给定任意数量的向量(...)通过根据它们的名称对各个元素值求和来组合它们.

add_vectors <- function(...) {
  a <- list(...)
  nms <- sort(unique(unlist(lapply(a, names))))
  out <- numeric(length(nms))
  names(out) <- nms
  for (v in a) out[names(v)] <- out[names(v)] + v

  out
}
Run Code Online (Sandbox Code Playgroud)

例:

v1 <- c(a=2,b=3,e=4)
v2 <- c(b=1,c=6,d=0,a=4)
add_vectors(v1, v2)
#
a b c d e 
6 4 6 0 4
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个更快的等效函数.

不幸的是,此刻我不知道如何实现这一点,R所以我想Rcpp.但是,为了转换Rcpp这个函数我错过了一些概念:

  1. 如何管理...参数.使用List类型参数Rcpp
  2. 如何迭代...参数中的向量.
  3. 如何通过名称访问(然后求和)向量的元素(这非常简单R,但我无法想象如何进行Rcpp).

所以我正在寻找可以帮助我提高这个功能的性能(在R …

performance r vector rcpp

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

加入并求和不兼容的矩阵

我的目标是使用(并保留)行和列名称"求和"两个不兼容的矩阵(具有不同维度的矩阵).

我已经想到了这种方法:将矩阵转换为data.table对象,连接它们然后对列向量求和.

一个例子:

> M1
  1 3 4 5 7 8
1 0 0 1 0 0 0
3 0 0 0 0 0 0
4 1 0 0 0 0 0
5 0 0 0 0 0 0
7 0 0 0 0 1 0
8 0 0 0 0 0 0
> M2
  1 3 4 5 8
1 0 0 1 0 0
3 0 0 0 0 0
4 1 …
Run Code Online (Sandbox Code Playgroud)

merge join r matrix data.table

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

模板化的Rcpp函数用于擦除NA值

我会编写一个函数(使用Rcpp),NAR向量中删除所有值.

在这之前,我通过Rcpp::cppFunction功能做了一点测试功能.

library(inline)
cppFunction('
  Vector<INTSXP> na_test(const Vector<INTSXP>& x) {
    return setdiff(x, Vector<INTSXP>::create(::traits::get_na<INTSXP>()));
  }
')
Run Code Online (Sandbox Code Playgroud)

这是这样的:

na_test(c(1, NA, NA, 1, 2, NA))
# [1] 1 2
Run Code Online (Sandbox Code Playgroud)

之后我尝试通过C++ 模板机制推广这个功能.

所以,在外部的.cpp文件(通过sourceCpp函数获取)中,我写道:

template <int RTYPE>
Vector<RTYPE> na_test_template(const Vector<RTYPE>& x) {
    return setdiff(x, Vector<RTYPE>::create(::traits::get_na<RTYPE>()));
}

// [[Rcpp::export(na_test_cpp)]]
SEXP na_test(SEXP x) {
    switch(TYPEOF(x)) {
        case INTSXP:
            return na_test_template<INTSXP>(x);
        case REALSXP:
            return na_test_template<REALSXP>(x);
    }
    return R_NilValue;
}
Run Code Online (Sandbox Code Playgroud)

这段代码编译但行为不同,我无法解释原因.

事实上:

na_test_cpp(c(1, NA, …
Run Code Online (Sandbox Code Playgroud)

templates r rcpp

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

分组时折叠data.table列值

给定一个data.table对象,我会将一些分组列的值折叠成一个对象,并将生成的对象插入到一个新的列中.

dt <- data.table(
            c('A|A', 'B|A', 'A|A', 'B|A', 'A|B'),
            c(0, 0, 1, 1, 0),
            c(22.7, 1.2, 0.3, 0.4, 0.0)
)
setnames(dt, names(dt), c('GROUPING', 'NAME', 'VALUE'))
dt
#    GROUPING NAME VALUE
# 1:      A|A    0  22.7
# 2:      B|A    0   1.2
# 3:      A|A    1   0.3
# 4:      B|A    1   0.4
# 5:      A|B    0   0.0
Run Code Online (Sandbox Code Playgroud)

我认为要做到这一点首先需要指定要分组的列,所以我应该从类似的东西开始dt[, OBJECTS := <expr>, by = GROUPING].

不幸的是,我不知道<expr>要使用的表达式,结果如下:

#    GROUPING   OBJECTS
# 1:      A|A  <vector>
# 2:      B|A  <vector> …
Run Code Online (Sandbox Code Playgroud)

grouping r data.table

5
推荐指数
2
解决办法
2881
查看次数

标签 统计

r ×5

data.table ×2

rcpp ×2

grouping ×1

join ×1

list ×1

matrix ×1

merge ×1

performance ×1

templates ×1

vector ×1