给定一个列表列表,我的目标是改变其结构(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函数,给定任意数量的向量(...)通过根据它们的名称对各个元素值求和来组合它们.
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这个函数我错过了一些概念:
...参数.使用List类型参数Rcpp?...参数中的向量.R,但我无法想象如何进行Rcpp).所以我正在寻找可以帮助我提高这个功能的性能(在R …
我的目标是使用(并保留)行和列名称"求和"两个不兼容的矩阵(具有不同维度的矩阵).
我已经想到了这种方法:将矩阵转换为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) 我会编写一个函数(使用Rcpp),NA从R向量中删除所有值.
在这之前,我通过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) 给定一个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)