我很难掌握setDT()功能的本质.当我在SO上阅读代码时,我经常遇到setDT()创建data.table的用法.当然,data.table()无处不在的使用.我觉得我领悟扎实的性质data.table()还没有相关的setDT()逃避我.?setDT告诉我这个:
setDT通过引用将列表(包括命名和未命名)和data.frames转换为data.tables .
以及:
用
data.table说法,所有set*函数都通过引用来改变它们的输入.也就是说,除了临时工作存储器之外,根本不会复制任何副本,而临时工作存储器与一列一样大.
所以这让我觉得我应该只setDT()用来制作一个data.table,对吗?是setDT()一个简单的列表data.table转换器?
library(data.table)
a <- letters[c(19,20,1,3,11,15,22,5,18,6,12,15,23)]
b <- seq(1,41,pi)
ab <- data.frame(a,b)
d <- data.table(ab)
e <- setDT(ab)
str(d)
#Classes ‘data.table’ and 'data.frame': 13 obs. of 2 variables:
# $ a: Factor w/ 12 levels "a","c","e","f",..: 9 10 1 2 5 7 11 3 8 4 ...
# $ b: num 1 4.14 7.28 …Run Code Online (Sandbox Code Playgroud) 不知何故,有时候,我最终会处于这样的状态:
> x
[1] 1 2 3
> get("x")
Error in get("x") : object 'x' not found
> x
[1] 1 2 3
Run Code Online (Sandbox Code Playgroud)
我无法可靠地重现它.在我的C代码中,我可能做错了什么?为什么x在提示符下键入会找到它,但get("x")不是?内部x和之间有什么区别get("x")?
任何提示非常感谢.我从R 2.14.0开始看到这个,但我的C代码也在变化.
编辑:可重复的例子
// test.c
#include <R.h>
#include <Rdefines.h>
SEXP test(SEXP df)
{
SEXP levels, s;
int j;
levels = getAttrib(VECTOR_ELT(df,0), R_LevelsSymbol);
Rprintf("levels %u, type %d, length %d, truelength %d\n",
levels,TYPEOF(levels),LENGTH(levels),TRUELENGTH(levels));
for (j=0; j<length(levels); j++) {
s = STRING_ELT(levels,j);
Rprintf("%d %d %s %u %d %d\n", length(levels), TYPEOF(s),
CHAR(s), …Run Code Online (Sandbox Code Playgroud) 我试图找到一种更有效的方法来逐步计算数据帧中的唯一数据点.
例如,我编写了以下代码:
df = matrix(c(1,2,3,3,4,5,1,2,4,4))
count = matrix(nrow = nrow(df),ncol=1)
for (i in 1:nrow(df)) {
count[i,1] = length(which(df[1:i,1] == df[i,1]))
}
Run Code Online (Sandbox Code Playgroud)
代码的目的是逐步计算特定值的每个实例,例如count列将具有以下结果:
1,1,1,2,1,1,2,2,2,3.
Run Code Online (Sandbox Code Playgroud)
到目前为止我编写的代码完成了这项工作,但上面的示例df只包含10个值.我试图执行此功能的实际数据框包含52,118 values,这需要花费大量时间.
有谁知道一种更有效的方法来执行上面的代码?