我正在尝试向我添加列data.table
,其中名称是动态的.另外,我需要by
在添加这些列时使用参数.例如:
test_dtb <- data.table(a = sample(1:100, 100), b = sample(1:100, 100), id = rep(1:10,10))
cn <- parse(text = "blah")
test_dtb[ , eval(cn) := mean(a), by = id]
# Error in `[.data.table`(test_dtb, , `:=`(eval(cn), mean(a)), by = id) :
# LHS of := must be a single column name when with=TRUE. When with=FALSE the LHS may be a vector of column names or positions.
Run Code Online (Sandbox Code Playgroud)
另一种尝试:
cn <- "blah"
test_dtb[ , cn := mean(a), by = id, with …
Run Code Online (Sandbox Code Playgroud) 我有一个时间序列x_0 ... x_t
.我想计算数据的指数加权方差.那是:
V = SUM{w_i*(x_i - x_bar)^2, i=1 to T} where SUM{w_i} = 1 and x_bar=SUM{w_i*x_i}
Run Code Online (Sandbox Code Playgroud)
参考:http://en.wikipedia.org/wiki/Weighted_mean#Weighted_sample_variance
目标是基本上加重观察的时间进一步缩短.这很容易实现,但我想尽可能多地使用内置的功能.有谁知道这对应于R?
谢谢
有没有办法选择数据框的所有列,除了具有特定名称的列.
它是模拟的df[, -1]
,除了使用列名而不是索引?
我在R中有一个列表:
a <- list(n1 = "hi", n2 = "hello")
Run Code Online (Sandbox Code Playgroud)
我想附加到这个命名列表,但名称必须是动态的.也就是说,它们是从字符串创建的(例如:paste("another","name",sep="_")
我尝试这样做不起作用:
c(a, parse(text="paste(\"another\",\"name\",sep=\"_\")=\"hola\"")
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?最终目标只是附加到此列表并动态选择我的名字.
我有一个名为的数据框,df
如下所示:
dte, val
2012-01-01, 23.2323
2012-01-02, 34.343
Run Code Online (Sandbox Code Playgroud)
列上的类型是日期和数字.我想使用已经打开的连接将其写入MySQL数据库.连接工作正常,因为我能够查询db罚款.我尝试运行以下内容:
dbWriteTable(con, name="table_name", value=df, field.types=list("date", "double(20,10)"))
Run Code Online (Sandbox Code Playgroud)
这会生成错误:
函数错误(classes,fdef,mtable):无法找到函数"make.db.names"的继承方法,签名为"MySQLConnection","NULL"
如果我没有指定field.types,并运行:
dbWriteTable(con, name="table_name", value=df)
Run Code Online (Sandbox Code Playgroud)
我收到错误:
mysqlExecStatement(conn,statement,...)出错:RS-DBI驱动程序:(无法运行语句:BLOB/TEXT列'dte'在密钥规范中使用,没有密钥长度)
任何人都可以对此有所了解吗?
谢谢
在调试函数时,我想向上移动到父框架并查看那里的一些变量.我该怎么做呢?
这是一个示例:
f <- function() {
x <-1
g(x+1)
}
g <- function(z) {
y = z+2
return(y)
}
Run Code Online (Sandbox Code Playgroud)
然后我使用debug("g")
和调试这两个函数debug("f")
.当我最终进入g
时Browser>
,我想回到f
检查x.
谢谢
我想在一个内部进行回归data.table
.的formula
要被动态构造的需求.我尝试了以下方法:
x = data.table(a=1:20, b=20:1, id=1:5)
> x[,as.list(coef(lm(as.formula("a ~ b")))),by=id]
Error in eval(expr, envir, enclos) : object 'a' not found
Run Code Online (Sandbox Code Playgroud)
如何将环境指定为进行评估的实际data.table的环境?
编辑:我意识到我可以做lm(a~b).我需要公式是动态的,所以它被构建为一个字符串.通过动态我的意思是公式可以在paste0(var_1, "~", var_2)
哪里var_1 = a
和var_2 = b
这是一个解决方案,我认为我们可以做得更好:
txt = parse(text="as.list(coef(lm(a ~ b)))")
> x[,eval(txt),by=id]
id (Intercept) b
1: 1 21 -1
2: 2 21 -1
3: 3 21 -1
4: 4 21 -1
5: 5 21 -1
Run Code Online (Sandbox Code Playgroud) 我想了解R在将参数传递给函数,创建变量副本等时使用的逻辑与内存使用情况有关.它什么时候实际创建变量的副本而不是仅仅传递对该变量的引用?特别是我很好奇的情况是:
f <- function(x) {x+1}
a <- 1
f(a)
Run Code Online (Sandbox Code Playgroud)
是a
字面意思传递还是被传递的参考?
x <- 1
y <- x
Run Code Online (Sandbox Code Playgroud)
复制参考?什么时候不是这样的?
如果有人能向我解释这一点,我将非常感谢.
使用data.table
包装时,我有点不确定何时需要setkey()
.例如,当使用:=
带有by
选项的运算符时,即使我没有设置键,事情似乎仍然非常快.有人可以在setkey()
必要时和不在时说明吗?如果在调用之前没有必要:=
,by
那么data.table
包是如此快速,因为大概它必须通过执行顺序搜索而不是二进制搜索来执行与apply
标准data.frame
R 相同的操作,因为它不知道我data.table
是否实际上按参数排序by
.
谢谢
我有一个向量,我需要对每个n
数字求和并返回结果.这是我计划当前这样做的方式.有更好的方法吗?
v = 1:100
n = 10
sidx = seq.int(from=1, to=length(v), by=n)
eidx = c((sidx-1)[2:length(sidx)], length(v))
thesum = sapply(1:length(sidx), function(i) sum(v[sidx[i]:eidx[i]]))
Run Code Online (Sandbox Code Playgroud)
这给出了:
thesum
[1] 55 155 255 355 455 555 655 755 855 955
Run Code Online (Sandbox Code Playgroud)